<p>pipenv ne respecte pas pip.conf</p>

Créé le 8 oct. 2017  ·  15Commentaires  ·  Source: pypa/pipenv

J'utilise devpi comme référentiel pypi privé où je peux mettre en cache les packages pypi par proxy et ajouter mes propres packages internes.

Mon pip.conf ressemble à ce qui suit :

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

Impossible de trouver un autre problème mentionnant ce problème.

Commentaire le plus utile

Ces entrées peuvent contenir des informations d'identification qui n'iront certainement pas dans le Pipfile qui est censé entrer dans le référentiel du projet.

Tous les 15 commentaires

Ces entrées doivent aller dans votre Pipfile.

@kennethreitz Je ne pense pas avoir été très clair dans mon cas, alors laissez-moi essayer de vous convaincre avec certains cas d'utilisation que j'ai rencontrés lors de mes premiers pas avec pipenv.
Tout d'abord, je commence tout juste à me plonger dans pipenv, son fonctionnement et son code. Je sais que vous pouvez spécifier une source dans Pipfile , j'ai aussi vu que vous pouvez utiliser des index nommés, cela ressemble à ce qui peut être fait dans ~/.pypirc .

Créer un nouveau projet/environnement 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)!

Installer un package à partir d'un index supplémentaire

Lors de l'installation d'un package que pypi ne connaît pas, cela ne fonctionnera pas tout de suite (il fonctionne avec pip ou pip-tools car ils utilisent les paramètres 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 est défini avec un nouvel index et que le package est associé à cet index (en suivant https://docs.pipenv.org/advanced.html#specifying-package-indexes), en essayant d'installer le package à partir de la ligne de commande appellera de toute façon pypi premier :

$ 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…

Utiliser un fichier d'exigences généré par pip-tools

Lors de l'utilisation de pip-tools , le fichier d'exigences commencera par l'index utilisé pour installer les packages :

#
# 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
[...]

Ce paramètre n'est pas respecté lors de l'utilisation du fichier d'exigences (à partir d'un projet propre) :

$ 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.

Observations

J'ai l'impression qu'il y a une sorte de "lacune" dans la gestion des index et de l'UX :

  • un utilisateur ne peut pas spécifier un index (par nom ou ressource) lors de l'installation via la ligne de commande qui oblige à créer une entrée pour l'index dans Pipfile et à associer chaque package à un index. Ce n'est pas très pratique dans le cas d'un tas de packages de pypi et d'un seul d'un index privé.
  • lors de l'installation d'un package à partir de la ligne de commande, quel est l'index par défaut qui doit être utilisé ?
  • lors de l'installation d'un package à partir d'un index personnalisé, il n'est pas possible de le spécifier sur la ligne de commande.
  • lorsqu'un index est spécifié dans un fichier d'exigences, il est ignoré.

Je plonge dans le code pour fournir un PR pour couvrir les problèmes exposés ci-dessus :

  • à l'initialisation d'un projet, cochez pip.conf pour les index personnalisés
  • définir un index par défaut dans Pipfile à utiliser lorsqu'aucun n'est spécifié
  • fournir un index par nom ou ressource sur la ligne de commande
  • respectez l'index fourni dans un fichier d'exigences et ajoutez-le à Pipfile

Si un index est utilisé dans un fichier d'exigences ou sur la ligne de commande mais qu'il est inconnu de Pipfile alors une entrée doit être ajoutée avec un nom automatique similaire au nom venv utilisé dans pipenv.

Pourquoi est-ce que je m'en soucie autant ? Vivant en Chine, pypi n'est pas toujours disponible ou rapide (nombreux délais d'attente ou lenteurs mortes) donc avoir un index comme devpi qui met en cache et me permet de mélanger mes packages privés est un double gain. Cela rend notre développement, nos tests, nos builds docker, etc. beaucoup plus rapides.

À titre d'exemple, il s'agit d'un comportement assez classique qui se produit lorsque des délais d'attente sont impliqués :

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
Non. Par exemple, je vis en Chine. La vitesse de pypi.python.org est généralement inférieure à 50k/s , je dois définir un miroir de Chine global. Ou je verrais beaucoup de

  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.

Donc, vous voulez dire que chaque fois que j'utilise pipenv, j'ai besoin d'écrire un pip.conf[Pipfile] pour cela ? C'est inacceptable pour moi.

Ces entrées peuvent contenir des informations d'identification qui n'iront certainement pas dans le Pipfile qui est censé entrer dans le référentiel du projet.

@eromoe @hrbonz Le problème est-il donc que pipenv résout d'abord pypi au lieu de serveurs privés ?

Pour moi c'est. J'ai vraiment besoin d'un paramètre de miroir global.

pip.conf est le suivant :

  1. Tout d'abord, le fichier à l'échelle du site est lu, puis
  2. Le fichier par utilisateur est lu, et enfin
  3. Le fichier spécifique à virtualenv est lu.

respect pip.conf signifie que l'utilisateur pip peut passer à pipenv de manière transparente.

J'aime l'idée de pouvoir mettre ces configs dans Pipfile (pour partager facilement la config avec d'autres développeurs), mais pipenv doit définitivement aussi respecter pip.conf (y avoir recours pour tout ce qui n'est pas défini dans Pipfile).

@erinxocon c'est l'un des problèmes que j'ai identifiés. J'ai été assez occupé avec le travail, mais j'espère pousser les premières relations publiques avant la semaine prochaine.

Salut, @kennethreitz merci pour ce projet génial.

J'ai une question, allez-vous reconsidérer votre position sur cette question après les arguments apportés dans cette discussion ?

J'ai un autre cas d'utilisation très similaire avec pip.conf et avoir des informations d'identification dans un fichier pip.conf séparé est valide pour avoir une construction prévisible sur le pipeline CI/CD et la machine de développement locale.

@hrbonz pour l'instant, j'ai trouvé une solution pour utiliser uniquement les variables env $PIP_INDEX_URL de pip jusqu'à ce que le fichier pip.conf soit pris en charge par pipenv. Ces $PIP_VARIABLE pourraient provenir pour le moment du fichier .env .

Je pense que combiner pypa/pip#3728 et des index personnalisés serait _la_ solution pour les index privés sans exposer les informations d'identification. Également commenté dans #1406.

Voici une solution de contournement si vous n'avez besoin que du nom de l'index et de l'URL (par exemple, en utilisant devpi ). Vous pouvez appeler cette fonction shell chaque fois que vous souhaitez créer un Pipfile qui a votre nom d'index personnalisé et votre URL, mais qui est par ailleurs vierge.

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
}

monsieur, sérieusement. J'ai un cas d'utilisation simple qui est directement affecté par ce problème.

J'ai un projet qui utilise pipenv. J'écris ce projet à la maison et au travail.
A la maison, je n'ai aucun problème. Au travail, je dois utiliser l'index pipy interne.

Comme le Pipfile est commité et poussé vers git, je ne peux pas continuer à le changer pendant que je saute de chez moi au travail. J'aimerais avoir une configuration externe qui signale à pipenv que je dois utiliser un autre index.

mettre cette configuration dans le Pipfile ne fonctionne pas.

Des mises à jour à ce sujet ?

@hrbonz @ninrod @GhostofGoes corrigé dans #1769 et #1809 -- les variables d'environnement dans Pipfiles sont maintenant étendues au moment de l'exécution

Merci à tous pour votre patience, notre priorité absolue a été la fonctionnalité de base de la base de code, donc des fonctionnalités comme celle-ci ont tendance à passer entre les mailles du filet. Toujours heureux de discuter des contributions pour les éléments que nous ne priorisons pas actuellement!

La seule alternative à laquelle je peux penser jusqu'à ce que cela soit corrigé est de remplacer l'URL PyPi afin que tout le trafic soit transféré vers le miroir interne de PyPi (par exemple, Artifactory ou autre). Étant donné que PyPi est de toute façon restreint en interne.

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