Pip: La instalación desde el repositorio de git en el directorio local falla si se especifica en requirements.txt y la ruta contiene espacios

Creado en 18 oct. 2019  ·  3Comentarios  ·  Fuente: pypa/pip

Medio ambiente

  • versión pip: 19.3.1
  • Versión de Python: 3.7.4
  • SO: Windows 10

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

  1. Especifique el repositorio de git local en una ruta que contenga espacios como una dependencia en requirements.txt
  2. Luego ejecute pip install -r requirements.txt
  3. Ocurre un error.

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.

auto-locked support

Todos 3 comentarios

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.

¿Fue útil esta página
0 / 5 - 0 calificaciones