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.
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
.
$ 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)!
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…
pip-tools
generiert wurdeBei 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.
Ich habe das Gefühl, dass es eine Art "Lücke" im Umgang mit Indizes und der UX gibt:
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.Ich tauche in den Code ein, um eine PR bereitzustellen, um die oben aufgedeckten Probleme abzudecken:
pip.conf
Initialisierung eines Projekts Pipfile
, der verwendet werden soll, wenn keiner angegeben istPipfile
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:
- Zuerst wird die Site-weite Datei gelesen, dann
- Die benutzerspezifische Datei wird gelesen und schließlich
- 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.
Hilfreichster Kommentar
Diese Einträge können Anmeldeinformationen enthalten, die sicherlich nicht in das Pipfile eingehen, das in das Projekt-Repository aufgenommen werden soll.