<p>pipenv no respeta pip.conf</p>

Creado en 8 oct. 2017  ·  15Comentarios  ·  Fuente: pypa/pipenv

Estoy usando devpi como un repositorio pypi privado donde puedo almacenar en caché los paquetes pypi y agregar mis propios paquetes internos.

Mi pip.conf parece a lo siguiente:

[global]
index_url = https://pypi.priv.xxx/prod/+simple/
[search]
index = https://pypi.priv.xxx/prod/

No se pudo encontrar otro problema que mencione este problema.

Comentario más útil

Estas entradas pueden contener credenciales que ciertamente no irán al Pipfile que se supone que irá al repositorio del proyecto.

Todos 15 comentarios

Estas entradas deben ir a su Pipfile.

@kennethreitz No creo que haya dejado mi caso realmente claro, así que déjame intentar convencerte con algunos casos de uso con los que me he encontrado al comenzar con pipenv.
En primer lugar, estoy empezando a sumergirme en pipenv, cómo funciona y su código. Sé que puede especificar una fuente en Pipfile , también vi que puede usar índices con nombre, que se parece a lo que se puede hacer en ~/.pypirc .

Crear un nuevo proyecto / entorno pipenv

$ mkdir foobar
$ cd foobar
$ pipenv install --verbose requests
⠋New python executable in /home/xxx/.local/share/virtualenvs/foobar-JdBU33Mf/bin/python         
Installing setuptools, pip, wheel...done.                                                      

Virtualenv location: /home/xxx/.local/share/virtualenvs/foobar-JdBU33Mf                         
Installing requests… 
⠙Installing u'requests'
$ "/home/xxx/.local/share/virtualenvs/foobar-JdBU33Mf/bin/pip" install   --verbose   "requests"
-i https://pypi.python.org/simple --exists-action w
Collecting requests
  1 location(s) to search for versions of requests:
  * https://pypi.python.org/simple/requests/
  Getting page https://pypi.python.org/simple/requests/
[...]
Successfully installed certifi-2017.7.27.1 chardet-3.0.4 idna-2.6 requests-2.18.4 urllib3-1.22
Cleaning up...

Adding requests to Pipfile's [packages]…
  PS: You have excellent taste! ✨ 🍰 ✨
Locking [dev-packages] dependencies…
Locking [packages] dependencies…
Updated Pipfile.lock (76e6d4)!

Instalar un paquete desde un índice adicional

Al instalar un paquete que pypi no conoce, no funcionará de inmediato (sí funciona con pip o pip-tools ya que usan la configuración pip.conf ).

$ pipenv install --verbose palantir
Installing palantir…
⠋Installing u'palantir'
$ "/home/hr/.local/share/virtualenvs/foobar-JdBU33Mf/bin/pip" install   --verbose   "palantir" -i https://pypi.python.org/simple --exists-action w
Collecting palantir
  1 location(s) to search for versions of palantir:
[...]
Error:  An error occurred while installing palantir!
  Could not find a version that satisfies the requirement palantir (from versions: )
No matching distribution found for palantir

Si Pipfile se configura con un nuevo índice y el paquete está asociado con este índice (siguiendo https://docs.pipenv.org/advanced.html#specifying-package-indexes), intente instalar el paquete desde la línea de comando llamará a pypi primero de todos modos:

$ pipenv install --verbose palantir
Installing palantir… 
⠋Installing u'palantir'                                                                        
$ "/home/hr/.local/share/virtualenvs/foobar-JdBU33Mf/bin/pip" install   --verbose   "palantir"
-i https://pypi.python.org/simple --exists-action w                                            
⠋$ "/home/hr/.local/share/virtualenvs/foobar-JdBU33Mf/bin/pip" install   --verbose   "palantir"
 -i https://pypi.priv.xxx/prod/+simple/ --exists-action w                
Collecting palantir                         
  1 location(s) to search for versions of palantir:
[...]
Successfully installed palantir-1.1.5
Cleaning up...

Adding palantir to Pipfile's [packages]…
Locking [dev-packages] dependencies…
Locking [packages] dependencies…

Utilice un archivo de requisitos generado por pip-tools

Al usar pip-tools , el archivo de requisitos comenzará con el índice usado para instalar paquetes:

#
# This file is autogenerated by pip-compile
# To update, run:
#
#    pip-compile --output-file requirements.txt requirements.in
#
--index-url https://pypi.priv.xxx/prod/+simple/

bcrypt==3.0.0
[...]

Esta configuración no se respeta cuando se usa el archivo de requisitos (comenzando con un proyecto limpio):

$ pipenv install -r requirements.txt
Requirements file provided! Importing into Pipfile…
Pipfile.lock (c23e27) out of date, updating to (3c7b08)…
Locking [dev-packages] dependencies…
Locking [packages] dependencies…
CRITICAL:pip.index:Could not find a version that satisfies the requirement palantir==1.1.5 (from versions: )
Warning: Your dependencies could not be resolved. You likely have a mismatch in your sub-dependencies.
  You can use $ pipenv install --skip-lock to bypass this mechanism, then run $ pipenv graph to inspect the situation.

Observaciones

Siento que hay una especie de "brecha" en el manejo de índices y UX:

  • un usuario no puede especificar un índice (por nombre o recurso) durante la instalación a través de la línea de comando, lo que obliga a uno a crear una entrada para el índice en Pipfile y asociar cada paquete con un índice. Eso no es muy conveniente en el caso de un montón de paquetes de pypi y solo uno de un índice privado.
  • al instalar un paquete desde la línea de comandos, ¿cuál es el índice predeterminado que debe usarse?
  • al instalar un paquete desde un índice personalizado, no es posible especificarlo en la línea de comando.
  • cuando se especifica un índice en un archivo de requisitos, se ignora.

Estoy buceando en el código para proporcionar un PR para cubrir los problemas expuestos anteriormente:

  • en la inicialización de un proyecto, verifique pip.conf para índices personalizados
  • definir un índice predeterminado en Pipfile que se utilizará cuando no se especifique ninguno
  • proporcionar un índice por nombre o recurso en la línea de comando
  • respete el índice proporcionado en un archivo de requisitos y agréguelo a Pipfile

Si se usa un índice en un archivo de requisitos o en la línea de comando, pero Pipfile desconoce, entonces se debe agregar una entrada con un nombre automático similar al nombre de venv usado en pipenv.

¿Por qué me preocupo tanto? Al vivir en China, pypi no siempre está disponible o es rápido (numerosos tiempos de espera o lentitud extrema), por lo que tener un índice como devpi que almacena en caché y me permite mezclar mis paquetes privados es una doble ganancia. Eso hace que nuestro desarrollo, pruebas, compilaciones de Docker, etc., sea mucho más rápido.

Como ejemplo, este es un comportamiento bastante clásico que ocurre cuando se involucran tiempos de espera:

Locking [dev-packages] dependencies…
Locking [packages] dependencies…
Warning: Your dependencies could not be resolved. You likely have a mismatch in your sub-dependencies.
  You can use $ pipenv install --skip-lock to bypass this mechanism, then run $ pipenv graph to inspect the situation.
Could not find a version that matches requests==2.17.3,==2.18.4
Tried: 0.2.0, 0.2.0, 0.2.1, 0.2.1, 0.2.2, 0.2.2, 0.2.3, 0.2.3, 0.2.4, 0.2.4, 0.3.0, 0.3.0, 0.3.1, 0.3.1, 0.3.2, 0.3.2, 0.3.3, 0.3.3, 0.3.4, 0.3.4, 0.4.0, 0.4.0, 0.4.1, 0.4.1, 0.5.0, 0.5.0, 0.5.1, 0.5.1, 0.6.0, 0.6.0, 0.6.1, 0.6.1, 0.6.2, 0.6.2, 0.6.3, 0.6.3, 0.6.4, 0.6.4, 0.6.5, 0.6.5, 0.6.6, 0.6.6, 0.7.0, 0.7.0, 0.7.1, 0.7.1, 0.7.2, 0.7.2, 0.7.3, 0.7.3, 0.7.4, 0.7.4, 0.7.5, 0.7.5, 0.7.6, 0.7.6, 0.8.0, 0.8.0, 0.8.1, 0.8.1, 0.8.2, 0.8.2, 0.8.3, 0.8.3, 0.8.4, 0.8.4, 0.8.5, 0.8.5, 0.8.6, 0.8.6, 0.8.7, 0.8.7, 0.8.8, 0.8.8, 0.8.9, 0.8.9, 0.9.0, 0.9.0, 0.9.1, 0.9.1, 0.9.2, 0.9.2, 0.9.3, 0.9.3, 0.10.0, 0.10.0, 0.10.1, 0.10.1, 0.10.2, 0.10.2, 0.10.3, 0.10.3, 0.10.4, 0.10.4, 0.10.6, 0.10.6, 0.10.7, 0.10.7, 0.10.8, 0.10.8, 0.11.1, 0.11.1, 0.11.2, 0.11.2, 0.12.0, 0.12.0, 0.12.1, 0.12.1, 0.13.0, 0.13.0, 0.13.1, 0.13.1, 0.13.2, 0.13.2, 0.13.3, 0.13.3, 0.13.4, 0.13.4, 0.13.5, 0.13.5, 0.13.6, 0.13.6, 0.13.7, 0.13.7, 0.13.8, 0.13.8, 0.13.9, 0.13.9, 0.14.0, 0.14.0, 0.14.1, 0.14.1, 0.14.2, 0.14.2, 1.0.0, 1.0.0, 1.0.1, 1.0.1, 1.0.2, 1.0.2, 1.0.3, 1.0.3, 1.0.4, 1.0.4, 1.1.0, 1.1.0, 1.2.0, 1.2.0, 1.2.1, 1.2.1, 1.2.2, 1.2.2, 1.2.3, 1.2.3, 2.0.0, 2.0.0, 2.0.0, 2.0.0, 2.0.1, 2.0.1, 2.0.1, 2.0.1, 2.1.0, 2.1.0, 2.1.0, 2.1.0, 2.2.0, 2.2.0, 2.2.0, 2.2.0, 2.2.1, 2.2.1, 2.2.1, 2.2.1, 2.3.0, 2.3.0, 2.3.0, 2.3.0, 2.4.0, 2.4.0, 2.4.0, 2.4.0, 2.4.1, 2.4.1, 2.4.1, 2.4.1, 2.4.2, 2.4.2, 2.4.2, 2.4.2, 2.4.3, 2.4.3, 2.4.3, 2.4.3, 2.5.0, 2.5.0, 2.5.0, 2.5.0, 2.5.1, 2.5.1, 2.5.1, 2.5.1, 2.5.2, 2.5.2, 2.5.2, 2.5.2, 2.5.3, 2.5.3, 2.5.3, 2.5.3, 2.6.0, 2.6.0, 2.6.0, 2.6.0, 2.6.1, 2.6.1, 2.6.1, 2.6.1, 2.6.2, 2.6.2, 2.6.2, 2.6.2, 2.7.0, 2.7.0, 2.7.0, 2.7.0, 2.8.0, 2.8.0, 2.8.0, 2.8.0, 2.8.1, 2.8.1, 2.8.1, 2.8.1, 2.9.0, 2.9.0, 2.9.0, 2.9.0, 2.9.1, 2.9.1, 2.9.1, 2.9.1, 2.9.2, 2.9.2, 2.9.2, 2.9.2, 2.10.0, 2.10.0, 2.10.0, 2.10.0, 2.11.0, 2.11.0, 2.11.0, 2.11.0, 2.11.1, 2.11.1, 2.11.1, 2.11.1, 2.12.0, 2.12.0, 2.12.0, 2.12.0, 2.12.1, 2.12.1, 2.12.1, 2.12.1, 2.12.2, 2.12.2, 2.12.2, 2.12.2, 2.12.3, 2.12.3, 2.12.3, 2.12.3, 2.12.4, 2.12.4, 2.12.4, 2.12.4, 2.12.5, 2.12.5, 2.12.5, 2.12.5, 2.13.0, 2.13.0, 2.13.0, 2.13.0, 2.14.0, 2.14.0, 2.14.0, 2.14.0, 2.14.1, 2.14.1, 2.14.1, 2.14.1, 2.14.2, 2.14.2, 2.14.2, 2.14.2, 2.15.1, 2.15.1, 2.15.1, 2.15.1, 2.16.0, 2.16.0, 2.16.0, 2.16.0, 2.16.1, 2.16.1, 2.16.1, 2.16.1, 2.16.2, 2.16.2, 2.16.2, 2.16.2, 2.16.3, 2.16.3, 2.16.3, 2.16.3, 2.16.4, 2.16.4, 2.16.4, 2.16.4, 2.16.5, 2.16.5, 2.16.5, 2.16.5, 2.17.0, 2.17.0, 2.17.0, 2.17.0, 2.17.1, 2.17.1, 2.17.1, 2.17.1, 2.17.2, 2.17.2, 2.17.2, 2.17.2, 2.17.3, 2.17.3, 2.17.3, 2.17.3, 2.18.0, 2.18.0, 2.18.0, 2.18.0, 2.18.1, 2.18.1, 2.18.1, 2.18.1, 2.18.2, 2.18.2, 2.18.2, 2.18.2, 2.18.3, 2.18.3, 2.18.3, 2.18.3, 2.18.4, 2.18.4, 2.18.4, 2.18.4

@kennethreitz
No. Por ejemplo, vivo en China. La velocidad a pypi.python.org suele ser inferior a 50k / s, tengo que configurar un espejo de China global. O vería mucho

  File "d:\python27\lib\site-packages\pipenv\patched\pip\_vendor\requests\packages\urllib3\response.
py", line 324, in read
    flush_decoder = True
  File "d:\python27\lib\contextlib.py", line 35, in __exit__
    self.gen.throw(type, value, traceback)
  File "d:\python27\lib\site-packages\pipenv\patched\pip\_vendor\requests\packages\urllib3\response.
py", line 246, in _error_catcher
    raise ReadTimeoutError(self._pool, None, 'Read timed out.')
pip._vendor.requests.packages.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host='pypi.py
thon.org', port=443): Read timed out.

Entonces, ¿quieres decir que cada vez que uso pipenv necesito escribir un pip.conf [Pipfile] para ello? Es inaceptable para mi.

Estas entradas pueden contener credenciales que ciertamente no irán al Pipfile que se supone que irá al repositorio del proyecto.

@eromoe @hrbonz Entonces, ¿el problema de que pipenv resuelve pypi primero en lugar de servidores privados?

Para mi lo es. Realmente necesito una configuración de espejo global.

pip.conf es lo siguiente:

  1. En primer lugar, se lee el archivo de todo el sitio, luego
  2. Se lee el archivo por usuario y finalmente
  3. Se lee el archivo específico de virtualenv.

respetar pip.conf significa que el usuario de pip puede cambiar a pipenv sin problemas.

Me gusta la idea de poder poner esas configuraciones en Pipfile (para compartir fácilmente la configuración con otros desarrolladores), pero pipenv definitivamente también debe respetar pip.conf (recurrir a él para cualquier cosa no definida en Pipfile).

@erinxocon este es uno de los problemas que identifiqué. He estado bastante ocupado con el trabajo, pero espero impulsar primero las relaciones públicas antes de la semana que viene.

Hola, @kennethreitz , gracias por el increíble proyecto.

Tengo una pregunta, ¿reconsiderará su posición sobre ese tema después de los argumentos introducidos en esa discusión?

Tengo otro caso de uso muy similar con pip.conf y tener credenciales en un archivo pip.conf separado es válido para tener una compilación predecible en la tubería CI / CD y la máquina de desarrollo local.

@hrbonz por ahora encontré una solución para usar solo las variables $PIP_INDEX_URL env de pip hasta que el archivo pip.conf sea compatible con pipenv. Esos $PIP_VARIABLE podrían obtenerse por ahora del archivo .env .

Creo que combinar pypa / pip # 3728 e índices personalizados sería _la_ solución para índices privados sin exponer credenciales. También comentado en # 1406.

Aquí hay una solución si todo lo que necesita es el nombre del índice y la URL (por ejemplo, usando devpi ). Puede invocar esta función de shell siempre que desee crear un Pipfile que tenga su nombre de índice y URL personalizados, pero que por lo demás sea impecable.

pipenv_init() {
  # pipenv issue #856: pipenv doesn't respect pip.conf
  # https://github.com/pypa/pipenv/issues/856

  # This function accepts one optional argument: the path to the pipenv
  # executable. If not set or empty, defaults to PATH lookup.
  local PIPENV="${1:-pipenv}"
  if ! command -v -- "${PIPENV}" > /dev/null; then
    >&2 printf '%s\n' 'pipenv not found'
    return 1
  fi

  # Check for required environment variables.
  if [[ -z "${PIPENV_INDEX_NAME-}" ]] || [[ -z "${PIPENV_INDEX_URL-}" ]]; then
    >&2 printf '%s\n' 'PIPENV_INDEX_{NAME,URL} env vars must be set and not empty'
    return 1
  fi

  # Create fresh Pipfile and virtualenv.
  #
  # While doing so, move requirements.txt out of the way so pipenv
  # doesn't attempt to populate the virtualenv before we have a chance
  # to modify Pipfile.
  # https://github.com/pypa/pipenv/blob/v9.0.3/pipenv/cli.py#L308-L330
  # https://github.com/pypa/pipenv/blob/v9.0.3/pipenv/project.py#L117-L119
  # https://github.com/pypa/pipenv/blob/v9.0.3/pipenv/project.py#L231-L240
  # https://github.com/pypa/pipenv/blob/v9.0.3/pipenv/utils.py#L1112-L1124
  local TEMP_REQUIREMENTS_TXT
  "${PIPENV}" --rm || true
  rm -f -- Pipfile Pipfile.lock
  if [[ -f requirements.txt ]]; then
    TEMP_REQUIREMENTS_TXT="$(mktemp)"
    mv -- requirements.txt "${TEMP_REQUIREMENTS_TXT}"
  fi
  "${PIPENV}" install
  if [[ -n "${TEMP_REQUIREMENTS_TXT}" ]]; then
    mv -- "${TEMP_REQUIREMENTS_TXT}" requirements.txt
  fi
  rm -- Pipfile.lock

  # Within Pipfile's `[[source]]` section, set `name` to
  # `${PIPENV_INDEX_NAME}` and `url` to `${PIPENV_INDEX_URL}`.
  local TEMP_PIPFILE="$(mktemp)"
  < Pipfile \
      sed \
      -e '/^\[\[source\]\]$/,/^\[/ { s|^\(name = \).*|\1"'"${PIPENV_INDEX_NAME}"'"| ; s|^\(url = \).*|\1"'"${PIPENV_INDEX_URL}"'"| ; }' \
    > "${TEMP_PIPFILE}"
  mv -- "${TEMP_PIPFILE}" Pipfile
}

caballero, en serio. Tengo un caso de uso simple que se ve afectado directamente por este problema.

Tengo un proyecto que usa pipenv. Escribo este proyecto tanto en casa como en el trabajo.
En casa no tengo ningún problema. En el trabajo, tengo que usar el índice pipy interno.

A medida que el Pipfile se confirma y se envía a git, no puedo seguir cambiándolo mientras salto de casa al trabajo. Me gustaría tener una configuración externa que le indique a pipenv que tengo que usar otro índice.

poner esta configuración dentro del Pipfile no funciona.

¿Alguna actualización sobre esto?

@hrbonz @ninrod @GhostofGoes corregido en # 1769 y # 1809 - las variables de entorno en Pipfiles ahora se expanden en tiempo de ejecución

Gracias a todos por su paciencia, nuestra máxima prioridad ha sido la funcionalidad principal del código base, por lo que características como esta tienden a pasar desapercibidas. ¡Sin embargo, siempre feliz de discutir las contribuciones de los elementos que actualmente no estamos priorizando!

La única alternativa que puedo pensar hasta que esto se solucione es anular la URL de PyPi para que todo el tráfico se reenvíe al espejo interno de PyPi (por ejemplo, Artifactory o cualquier otra cosa). Dado que PyPi está restringido internamente de todos modos.

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