Medio ambiente
Descripción
Puedo instalar un paquete desde un repositorio de git en un directorio local como tal:
pip install git+file:///"k/my/path with/lots of/spaces/repo/.git/"
Sin embargo, cuando pongo git+file:///"k/my/path with/lots of/spaces/repo/.git/"
en mi requirements.txt
y luego trato de instalar con pip install -r requirements.txt
, falla con ValueError: No closing quotation
.
Comportamiento esperado
Se esperaba que el paquete se instalara desde el directorio local tal como está cuando ejecuto el comando directamente.
Cómo reproducir
requirements.txt
pip install -r requirements.txt
Producción
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
Consulte también la pregunta SO relacionada.
El manejo de las comillas cuando pip se ejecuta directamente está gobernado por su shell. En Bash, por ejemplo, los pares de comillas no anidados se eliminan y su contenido se concatena con lo que viene antes / después para crear cada argumento.
Los archivos de requisitos, por otro lado, se leen como están por optparse y no se realiza ningún manejo o eliminación especial de cotizaciones.
Dicho esto, en este caso, al intentar proporcionar una URL, los caracteres URL no válidos (como el espacio) deben estar codificados en porcentaje (el espacio es% 20). Vea este script para ver un ejemplo que instala con éxito un repositorio de git que tenía espacios en la ruta:
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
Producción
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))
Esto funcionó muchas gracias !!
¿Quieres responder a la pregunta SO? De lo contrario, citaré su explicación como respuesta, si no le importa.
Voy a cerrar este problema, por curiosidad, ¿es este un problema exclusivo de Windows? Porque según el usuario 00 en SO, le funciona sin% 20 en Mac.
Me alegro de que haya ayudado. :)
¡Por favor adelante!
Me sorprendería un poco si el comportamiento fuera específico de la plataforma. El código aquí debería ser lo que divide la URL y no veo nada que cambie entre plataformas. En cualquier caso, la codificación porcentual debería funcionar en todas partes, por lo que definitivamente es el camino a seguir incluso para las personas que pueden hacerlo funcionar de otra manera en otras plataformas.