Pip: L'installation à partir de git repo dans le répertoire local échoue si spécifié dans requirements.txt et que le chemin contient des espaces

Créé le 18 oct. 2019  ·  3Commentaires  ·  Source: pypa/pip

Environnement

  • version pip : 19.3.1
  • Version Python : 3.7.4
  • Système d'exploitation : Windows 10

La description
Je suis capable d'installer un package à partir d'un dépôt git dans un répertoire local en tant que tel :

pip install git+file:///"k/my/path with/lots of/spaces/repo/.git/"

Cependant, lorsque je mets git+file:///"k/my/path with/lots of/spaces/repo/.git/" dans mon requirements.txt et que j'essaie de l'installer avec pip install -r requirements.txt cela échoue avec ValueError: No closing quotation .

Comportement prévisible
Je m'attendais à ce que le package soit installé à partir du répertoire local, comme c'est le cas lorsque j'exécute la commande directement.

Comment reproduire

  1. Spécifiez le dépôt git local à un chemin contenant des espaces en tant que dépendance dans requirements.txt
  2. Ensuite, exécutez pip install -r requirements.txt
  3. Une erreur se produit.

Sortir

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

Voir également la question SO liée .

auto-locked support

Tous les 3 commentaires

Le traitement des guillemets lorsque pip est exécuté directement est régi par votre shell. Dans Bash, par exemple, les paires de guillemets non imbriquées sont supprimées et leur contenu concaténé avec ce qui vient avant/après pour créer chaque argument.

Les fichiers d'exigences, d'autre part, sont lus tels quels par optparse et aucun traitement ou suppression de devis spécial n'a lieu.

Cela dit, dans ce cas, lorsque vous essayez de fournir une URL, les caractères d'URL non valides (comme l'espace) doivent être codés en pourcentage (l'espace est %20). Consultez ce script pour un exemple d'installation réussie d'un dépôt git contenant des espaces dans le chemin :


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


Sortir

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))

Cela a fonctionné merci beaucoup !!

Voulez-vous répondre à la question SO ? Sinon, je vais citer votre explication comme réponse, si cela ne vous dérange pas.

Je vais clore ce problème, par curiosité, est-ce un problème uniquement Windows ? Car selon l'utilisateur 00 sur SO, cela fonctionne pour lui sans %20 sur Mac.

Je suis content que cela ait aidé. :)

S'il vous plaît, allez-y !

Je serais un peu surpris si le comportement est spécifique à la plate-forme. Le code ici devrait être ce qui sépare l'URL et je ne vois rien qui changerait d'une plate-forme à l'autre. Dans tous les cas, l'encodage en pourcentage devrait fonctionner partout, c'est donc certainement la voie à suivre, même pour les personnes qui pourraient le faire fonctionner d'une autre manière sur d'autres plates-formes.

Cette page vous a été utile?
0 / 5 - 0 notes