Umfeld
Beschreibung
Ich bin in der Lage, ein Paket aus einem Git-Repo in einem lokalen Verzeichnis als solches zu installieren:
pip install git+file:///"k/my/path with/lots of/spaces/repo/.git/"
Wenn ich jedoch git+file:///"k/my/path with/lots of/spaces/repo/.git/"
in mein requirements.txt
und dann versuche, mit pip install -r requirements.txt
zu installieren, schlägt es mit ValueError: No closing quotation
fehl.
Erwartetes Verhalten
Erwartet, dass das Paket aus dem lokalen Verzeichnis installiert wird, genauso wie es ist, wenn ich den Befehl direkt ausführe.
So reproduzieren Sie
requirements.txt
pip install -r requirements.txt
Ausgabe
pip install -r .\requirements.txt
ERROR: Exception:
Traceback (most recent call last):
File "C:\Users\username\AppData\Local\Continuum\anaconda3\lib\site-packages\pip\_internal\cli\base_command.py", line 178, in main
status = self.run(options, args)
File "C:\Users\username\AppData\Local\Continuum\anaconda3\lib\site-packages\pip\_internal\commands\install.py", line 326, in run
self.name, wheel_cache
File "C:\Users\username\AppData\Local\Continuum\anaconda3\lib\site-packages\pip\_internal\cli\base_command.py", line 288, in populate_requirement_set
use_pep517=options.use_pep517):
File "C:\Users\username\AppData\Local\Continuum\anaconda3\lib\site-packages\pip\_internal\req\req_file.py", line 112, in parse_requirements
for req in req_iter:
File "C:\Users\username\AppData\Local\Continuum\anaconda3\lib\site-packages\pip\_internal\req\req_file.py", line 173, in process_line
shlex.split(options_str), defaults) # type: ignore
File "C:\Users\username\AppData\Local\Continuum\anaconda3\lib\shlex.py", line 305, in split
return list(lex)
File "C:\Users\username\AppData\Local\Continuum\anaconda3\lib\shlex.py", line 295, in __next__
token = self.get_token()
File "C:\Users\username\AppData\Local\Continuum\anaconda3\lib\shlex.py", line 105, in get_token
raw = self.read_token()
File "C:\Users\username\AppData\Local\Continuum\anaconda3\lib\shlex.py", line 187, in read_token
raise ValueError("No closing quotation")
ValueError: No closing quotation
requirements.txt
:
git+file:///"k/my/path with/lots of/spaces/repo/.git/"
pandas
requests
retrying
xlsxwriter
Siehe auch zugehörige SO-Frage .
Die Behandlung von Anführungszeichen, wenn pip direkt ausgeführt wird, wird von Ihrer Shell geregelt. In Bash zum Beispiel werden nicht verschachtelte Anführungszeichenpaare entfernt und ihr Inhalt mit dem, was davor/danach kommt, verkettet, um jedes Argument zu erstellen.
Anforderungsdateien hingegen werden von optparse so gelesen, wie sie sind, und es findet keine spezielle Behandlung von Angeboten oder Stripping statt.
Allerdings müssen in diesem Fall beim Versuch, eine URL bereitzustellen, die ungültigen URL-Zeichen (wie Leerzeichen) prozentcodiert sein (Leerzeichen ist %20). In diesem Skript finden Sie ein Beispiel, das erfolgreich ein Git-Repository installiert, das Leerzeichen im Pfad hatte:
repro.sh
#!/bin/sh
cd "$(mktemp -d)"
dir="$PWD/a b c/d e f"
mkdir -p "$dir"
cd "$dir"
cat <<EOF > setup.py
from setuptools import setup
setup(name='example')
EOF
git init
git add .
git commit -m init
cd -
python -V
python -m venv venv
venv/bin/python -m pip install --upgrade pip
cat <<EOF | tee requirements.txt
git+file://$PWD/a%20b%20c/d%20e%20f
EOF
python -m pip install -r requirements.txt
Ausgabe
Initialized empty Git repository in /tmp/user/1000/tmp.kITsbsZCPO/a b c/d e f/.git/
[master (root-commit) d347157] init
1 file changed, 3 insertions(+)
create mode 100644 setup.py
/tmp/user/1000/tmp.kITsbsZCPO
Python 3.7.2
Collecting pip
Using cached https://files.pythonhosted.org/packages/00/b6/9cfa56b4081ad13874b0c6f96af8ce16cfbc1cb06bedf8e9164ce5551ec1/pip-19.3.1-py2.py3-none-any.whl
Installing collected packages: pip
Found existing installation: pip 18.1
Uninstalling pip-18.1:
Successfully uninstalled pip-18.1
Successfully installed pip-19.3.1
git+file:///tmp/user/1000/tmp.kITsbsZCPO/a%20b%20c/d%20e%20f
Collecting git+file:///tmp/user/1000/tmp.kITsbsZCPO/a%20b%20c/d%20e%20f (from -r requirements.txt (line 1))
Cloning file:///tmp/user/1000/tmp.kITsbsZCPO/a b c/d e f to /tmp/user/1000/pip-req-build-ts2s099_
Requirement already satisfied (use --upgrade to upgrade): example==0.0.0 from git+file:///tmp/user/1000/tmp.kITsbsZCPO/a%20b%20c/d%20e%20f in /home/chris/.pyenv/versions/3.7.2/lib/python3.7/site-packages (from -r requirements.txt (line 1))
Das hat geklappt vielen Dank!!
Möchten Sie die SO-Frage beantworten? Ansonsten werde ich Ihre Erklärung als Antwort zitieren, wenn Sie nichts dagegen haben.
Ich werde dieses Problem aus Neugier schließen, ist dies nur ein Windows-Problem? Denn laut Benutzer 00 auf SO funktioniert es für ihn ohne %20 auf dem Mac.
Ich bin froh, dass es geholfen hat. :)
Bitte fahre fort!
Ich wäre ein wenig überrascht, wenn das Verhalten plattformspezifisch ist. Der Code hier sollte das Aufteilen der URL sein und ich sehe nichts, was sich plattformübergreifend ändern würde. Auf jeden Fall sollte die Prozentcodierung überall sofort funktionieren, so dass es definitiv der richtige Weg ist, auch für Leute, die es auf anderen Plattformen möglicherweise auf andere Weise zum Laufen bringen.