<p>pipenv respektiert pip.conf nicht</p>

Erstellt am 8. Okt. 2017  ·  15Kommentare  ·  Quelle: pypa/pipenv

Ich verwende devpi als privates Pypi-Repository, in dem ich Pypi-Pakete als Proxy zwischenspeichern und meine eigenen internen Pakete hinzufügen kann.

Mein pip.conf sieht wie folgt aus:

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

Konnte kein anderes Problem finden, das dieses Problem erwähnt.

Hilfreichster Kommentar

Diese Einträge können Anmeldeinformationen enthalten, die sicherlich nicht in das Pipfile eingehen, das in das Projekt-Repository aufgenommen werden soll.

Alle 15 Kommentare

Diese Einträge müssen in Ihr Pipfile aufgenommen werden.

@kennethreitz Ich glaube nicht, dass ich meinen Fall wirklich klar gemacht habe, also lassen Sie mich versuchen, Sie mit einigen Anwendungsfällen zu überzeugen, auf die ich bei den ersten Schritten mit pipenv gestoßen bin.
Zunächst einmal fange ich gerade an, mich mit pipenv, seiner Funktionsweise und seinem Code zu befassen. Ich weiß, dass Sie eine Quelle in Pipfile angeben können, ich habe auch gesehen, dass Sie benannte Indizes verwenden können, die ähnlich aussehen wie in ~/.pypirc .

Erstellen eines neuen Pipenv-Projekts/-Umgebung

$ 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)!

Installieren Sie ein Paket aus einem zusätzlichen Index

Wenn ein Paket installiert wird, das pypi nicht kennt, funktioniert es nicht sofort (es funktioniert mit pip oder pip-tools, da sie pip.conf Einstellungen verwenden).

$ 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

Wenn Pipfile mit einem neuen Index festgelegt wird und das Paket mit diesem Index verknüpft ist (nach https://docs.pipenv.org/advanced.html#specifying-package-indexes), versuchen Sie, das Paket von . zu installieren die Befehlszeile ruft sowieso zuerst pypi :

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

Verwenden Sie eine Anforderungsdatei, die von pip-tools generiert wurde

Bei Verwendung von pip-tools beginnt die Anforderungsdatei mit dem Index, der zum Installieren von Paketen verwendet wird:

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

Diese Einstellung wird nicht beachtet, wenn die Anforderungsdatei verwendet wird (beginnend mit einem sauberen Projekt):

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

Beobachtungen

Ich habe das Gefühl, dass es eine Art "Lücke" im Umgang mit Indizes und der UX gibt:

  • Ein Benutzer kann während der Installation über die Befehlszeile keinen Index (nach Name oder Ressource) angeben, was einen dazu zwingt, einen Eintrag für den Index in Pipfile zu erstellen und jedes Paket mit einem Index zu verknüpfen. Das ist bei einer Reihe von Paketen von pypi und nur einem von einem privaten Index nicht sehr praktisch.
  • Welcher Standardindex sollte bei der Installation eines Pakets über die Befehlszeile verwendet werden?
  • Wenn Sie ein Paket von einem benutzerdefinierten Index installieren, ist es nicht möglich, es in der Befehlszeile anzugeben.
  • Wenn ein Index in einer Anforderungsdatei angegeben ist, wird er ignoriert.

Ich tauche in den Code ein, um eine PR bereitzustellen, um die oben aufgedeckten Probleme abzudecken:

  • Überprüfen Sie pip.conf Initialisierung eines Projekts
  • einen Standardindex in Pipfile , der verwendet werden soll, wenn keiner angegeben ist
  • einen Index nach Name oder Ressource auf der Befehlszeile bereitstellen
  • respektiere den in einer Anforderungsdatei bereitgestellten Index und füge ihn zu Pipfile

Wenn ein Index entweder in einer Anforderungsdatei oder in der Befehlszeile verwendet wird, aber Pipfile unbekannt ist, sollte ein Eintrag mit einem automatischen Namen hinzugefügt werden, der der in pipenv verwendeten venv-Namensgebung ähnelt.

Warum ist mir das so wichtig? In China lebend, ist pypi nicht immer verfügbar oder schnell (zahlreiche Zeitüberschreitungen oder tote Langsamkeit), daher ist es ein doppelter Gewinn, einen Index wie devpi zu haben, der zwischenspeichert und es mir ermöglicht, meine privaten Pakete zu mischen. Das macht unsere Entwicklung, Tests, Docker-Builds usw. viel schneller.

Als Beispiel ist dies ein ziemlich klassisches Verhalten, das auftritt, wenn Zeitüberschreitungen auftreten:

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
NÖ. Ich lebe zum Beispiel in China. Die Geschwindigkeit zu pypi.python.org ist normalerweise niedriger als 50k/s, ich muss einen globalen China-Spiegel einstellen. Oder ich würde viele sehen

  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.

Sie meinen also, jedes Mal, wenn ich pipenv verwende, muss eine pip.conf[Pipfile] dafür geschrieben werden? Es ist für mich inakzeptabel.

Diese Einträge können Anmeldeinformationen enthalten, die sicherlich nicht in das Pipfile eingehen, das in das Projekt-Repository aufgenommen werden soll.

@eromoe @hrbonz Ist das Problem also, dass pipenv zuerst pypi anstelle von privaten Servern auflöst?

Für mich ist es. Ich brauche wirklich eine globale Spiegeleinstellung.

pip.conf ist wie folgt:

  1. Zuerst wird die Site-weite Datei gelesen, dann
  2. Die benutzerspezifische Datei wird gelesen und schließlich
  3. Die virtualenv-spezifische Datei wird gelesen.

Respekt pip.conf bedeutet, dass der pip-Benutzer nahtlos zu pipenv wechseln kann.

Ich mag die Idee, diese Konfigurationen in Pipfile ablegen zu können (um die Konfiguration einfach für andere Entwickler freizugeben), aber pipenv muss definitiv auch pip.conf respektieren (zurückgreifen für alles, was nicht in Pipfile).

@erinxocon Dies ist eines der Probleme, die ich identifiziert habe. Ich war ziemlich beschäftigt mit der Arbeit, aber ich hoffe, die erste PR vor nächster Woche vorantreiben zu können.

Hi, @kennethreitz, danke für das tolle Projekt.

Ich habe eine Frage, werden Sie Ihre Position zu diesem Thema überdenken, nachdem Argumente in diese Diskussion eingebracht wurden?

Ich habe einen anderen sehr ähnlichen Anwendungsfall mit pip.conf und das Vorhandensein von Anmeldeinformationen in einer separaten pip.conf-Datei ist gültig, um einen vorhersehbaren Build auf der CI/CD-Pipeline und dem lokalen Entwicklungscomputer zu haben.

@hrbonz fürs $PIP_INDEX_URL env-Variablen von pip zu verwenden, bis die Datei pip.conf von pipenv unterstützt wird. Diese $PIP_VARIABLE könnten vorerst aus der .env Datei bezogen werden.

Ich denke, dass die Kombination von pypa/pip#3728 und benutzerdefinierten Indizes _die_ Lösung für private Indizes wäre, ohne Anmeldeinformationen offenzulegen. Auch kommentiert in #1406.

Hier ist eine Problemumgehung, wenn Sie nur den Indexnamen und die URL benötigen (zB mit devpi ). Sie können diese Shell-Funktion immer dann aufrufen, wenn Sie eine Pipfile erstellen möchten, die Ihren benutzerdefinierten Indexnamen und Ihre URL hat, aber ansonsten makellos ist.

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
}

Herr, im Ernst. Ich habe einen einfachen Anwendungsfall, der direkt von diesem Problem betroffen ist.

Ich habe ein Projekt, das pipenv verwendet. Ich schreibe dieses Projekt sowohl zu Hause als auch bei der Arbeit.
Zuhause habe ich kein Problem. Bei der Arbeit muss ich den internen Pipy-Index verwenden.

Da das Pipfile festgeschrieben und an git gepusht wird, kann ich es nicht ständig ändern, wenn ich von zu Hause zur Arbeit hüpfe. Ich möchte eine externe Konfiguration haben, die pipenv signalisiert, dass ich einen anderen Index verwenden muss.

Das Einfügen dieser Konfiguration in das Pipfile funktioniert nicht.

Irgendwelche Updates dazu?

@hrbonz @ninrod @GhostofGoes in #1769 und #1809 behoben -- Umgebungsvariablen in Pipfiles werden jetzt zur Laufzeit erweitert

Vielen Dank für Ihre Geduld, unsere höchste Priorität war die Kernfunktionalität der Codebasis, daher neigen Funktionen wie diese dazu, durch die Ritzen zu rutschen. Besprechen Sie immer gerne Beiträge für Artikel, die wir derzeit jedoch nicht priorisieren!

Die einzige Alternative, die mir einfällt, bis dies behoben ist, besteht darin, die PyPi-URL zu überschreiben, damit der gesamte Datenverkehr an den internen Spiegel von PyPi (zum Beispiel Artifactory oder so weiter) weitergeleitet wird. Da PyPi ohnehin intern eingeschränkt ist.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen