Environnement
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
requirements.txt
pip install -r requirements.txt
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 .
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.