Pip: Die Installation von git repo im lokalen Verzeichnis schlägt fehl, wenn in Requirements.txt angegeben und der Pfad Leerzeichen enthält

Erstellt am 18. Okt. 2019  ·  3Kommentare  ·  Quelle: pypa/pip

Umfeld

  • Pip-Version: 19.3.1
  • Python-Version: 3.7.4
  • Betriebssystem: Windows 10

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

  1. Geben Sie ein lokales Git-Repository in einem Pfad mit Leerzeichen als Abhängigkeit in requirements.txt
  2. Führen Sie dann pip install -r requirements.txt
  3. Ein Fehler tritt auf.

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 .

auto-locked support

Alle 3 Kommentare

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.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen