Eines Tages, als ich Pipenv benutzte, bekam ich einen mysteriösen Fehler.
Es fiel mir schwer, die Ursache herauszufinden, und ich beschloss, sie als Memo zu schreiben. Schließlich wurde es behoben. Wenn Sie also unter ähnlichen Symptomen leiden und nur wissen möchten, wie Sie damit umgehen sollen, gehen Sie bitte zu Lösung.
Das erste Mal, dass ich diesen Fehler bemerkte, war, als ich einen automatisierten Test in CI einrichten wollte. Ich habe Code geschrieben, um einen automatisierten Test in einer Docker-Umgebung auszuführen, aber beim Ausführen von "pipenv sync" oder "pipenv install" in Docker ist der folgende Fehler aufgetreten.
An error occurred while installing readme-renderer==24.0 --hash=sha256:bb16f55b259f27f75f640acf5e00cf897845a8b3e4731b5c1a436e4b8529202f --hash=sha256:c8532b79afc0375a85f10433eca157d6b50f7d6990f337fa498c96cd4bfc203d! Will try again.
An error occurred while installing requests==2.22.0 --hash=sha256:11e007a8a2aa0323f5a921e9e6a2d7e4e67d9877e85773fba9ba6419025cbeb4 --hash=sha256:9cf5292fcd0f598c671cfc1e0d7d1a7f13bb8085e9a590f48c010551dc6c4b31 --hash=sha256:11e007a8a2aa0323f5a921e9e6a2d7e4e67d9877e85773fba9ba6419025cbeb4 --hash=sha256:9cf5292fcd0f598c671cfc1e0d7d1a7f13bb8085e9a590f48c010551dc6c4b31! Will try again.
An error occurred while installing requests-toolbelt==0.9.1 --hash=sha256:380606e1d10dc85c3bd47bf5a6095f815ec007be7a8b69c878507068df059e6f --hash=sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0! Will try again.
An error occurred while installing secretstorage==3.1.1 ; sys_platform == 'linux' --hash=sha256:20c797ae48a4419f66f8d28fc221623f11fc45b6828f96bdb1ad9990acb59f92 --hash=sha256:7a119fb52a88e398dbb22a4b3eb39b779bfbace7e4153b7bc6e5954d86282a8a! Will try again.
An error occurred while installing sphinx==2.2.1 --hash=sha256:31088dfb95359384b1005619827eaee3056243798c62724fd3fa4b84ee4d71bd --hash=sha256:52286a0b9d7caa31efee301ec4300dbdab23c3b05da1c9024b4e84896fb73d79! Will try again.
An error occurred while installing sphinx-git==11.0.0 --hash=sha256:6bf9d837de108c79fb7db585ebd590fd48f4d1f830b540420d0ca675f3b9f800! Will try again.
An error occurred while installing twine==3.1.0 --hash=sha256:1a87ae3f1e29a87a8ac174809bf0aa996085a0368fe500402196bda94b23aab3 --hash=sha256:ba8ba1b39987f1c22d9162f7dd3b4668388640e5f7158c15226624f88e464836! Will try again.
Nachdem ich verschiedene Dinge ausprobiert hatte, stellte ich fest, dass das Ausführen von "pipenv install" oder "pipenv sync" ohne eine venv-Umgebung einen Fehler verursacht. Da Hash angezeigt wird, habe ich vorerst versucht, Pipfile.lock zu löschen und dann pipenv install` ausgeführt, aber es wird immer noch eine Fehlermeldung angezeigt. Die zu diesem Zeitpunkt bestätigte Situation ist wie folgt.
Nun, was ist das ...
Selbst nach dem Löschen der venv-Umgebung und von Pipfile.lock wird weiterhin ein Fehler angezeigt, sodass fast sicher ist, dass die Ursache Pipfile ist. Das Pipfile ist zu diesem Zeitpunkt wie folgt.
[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true
[dev-packages]
flake8 = "*"
autopep8 = "*"
isort = "*"
autoflake = "*"
pytest = "*"
pytest-cov = "*"
qiitacli = {path = "."}
twine = "*"
sphinx = "*"
sphinx-git = "*"
pypandoc = "*"
[packages]
click = ">=7.0"
qiita_v2 = ">=0.2.1"
[requires]
python_version = "3"
[scripts]
main = "python qiitacli/client.py"
Ich weiß nicht, was mit meinem Gehirn los ist ...
Ich habe versucht, die Ausgabe mit der Option "-v" zum Zeitpunkt der "pipenv-Installation" zu betrachten. Ich war überrascht, dass es mehr Output gab als ich erwartet hatte.
Hier ist das Protokoll, das die Ursache zu sein scheint.
ERROR: In --require-hashes mode, all requirements must have their versions pinned with ==. These do not:
tqdm>=4.14 from https://files.pythonhosted.org/packages/bb/62/6f823501b3bf2bac242bd3c320b592ad1516b3081d82c77c1d813f076856/tqdm-4.39.0-py2.py3-none-any.whl#sha256=5a1f3d58f3eb53264387394387fe23df469d2a3fab98c9e7f99d5c146c119873 (from twine==3.1.0->-r /tmp/pipenv-pbslpsa_-requirements/pipenv-u629hk8s-requirement.txt (line 1)) readme-renderer>=21.0 from https://files.pythonhosted.org/packages/c3/7e/d1aae793900f36b097cbfcc5e70eef82b5b56423a6c52a36dce51fedd8f0/readme_renderer-24.0-py2.py3-none-any.whl#sha256=c8532b79afc0375a85f10433eca157d6b50f7d6990f337fa498c96cd4bfc203d (from twine==3.1.0->-r /tmp/pipenv-pbslpsa_-requirements/pipenv-u629hk8s-requirement.txt (line 1))
requests-toolbelt!=0.9.0,>=0.8.0 from https://files.pythonhosted.org/packages/60/ef/7681134338fc097acef8d9b2f8abe0458e4d87559c689a8c306d0957ece5/requests_toolbelt-0.9.1-py2.py3-none-any.whl#sha256=380606e1d10dc85c3bd47bf5a6095f815ec007be7a8b69c878507068df059e6f (from twine==3.1.0->-r /tmp/pipenv-pbslpsa_-requirements/pipenv-u629hk8s-requirement.txt (line 1))
secretstorage; sys_platform == "linux" from https://files.pythonhosted.org/packages/82/59/cb226752e20d83598d7fdcabd7819570b0329a61db07cfbdd21b2ef546e3/SecretStorage-3.1.1-py3-none-any.whl#sha256=7a119fb52a88e398dbb22a4b3eb39b779bfbace7e4153b7bc6e5954d86282a8a (from keyring>=15.1->twine==3.1.0->-r /tmp/pipenv-pbslpsa_-requirements/pipenv-u629hk8s-requirement.txt (line 1))
Exception information:
Traceback (most recent call last):
File "/hoge/.venv/lib/python3.6/site-packages/pip/_internal/cli/base_command.py", line 153, in _main
status = self.run(options, args)
File "/hoge/.venv/lib/python3.6/site-packages/pip/_internal/commands/install.py", line 382, in run
resolver.resolve(requirement_set)
File "/hoge/.venv/lib/python3.6/site-packages/pip/_internal/legacy_resolve.py", line 208, in resolve
raise hash_errors
pip._internal.exceptions.HashErrors: In --require-hashes mode, all requirements must have their versions pinned with ==. These do not:
tqdm>=4.14 from https://files.pythonhosted.org/packages/bb/62/6f823501b3bf2bac242bd3c320b592ad1516b3081d82c77c1d813f076856/tqdm-4.39.0-py2.py3-none-any.whl#sha256=5a1f3d58f3eb53264387394387fe23df469d2a3fab98c9e7f99d5c146c119873 (from twine==3.1.0->-r /tmp/pipenv-pbslpsa_-requirements/pipenv-u629hk8s-requirement.txt (line 1)) readme-renderer>=21.0 from https://files.pythonhosted.org/packages/c3/7e/d1aae793900f36b097cbfcc5e70eef82b5b56423a6c52a36dce51fedd8f0/readme_renderer-24.0-py2.py3-none-any.whl#sha256=c8532b79afc0375a85f10433eca157d6b50f7d6990f337fa498c96cd4bfc203d (from twine==3.1.0->-r /tmp/pipenv-pbslpsa_-requirements/pipenv-u629hk8s-requirement.txt (line 1))
requests-toolbelt!=0.9.0,>=0.8.0 from https://files.pythonhosted.org/packages/60/ef/7681134338fc097acef8d9b2f8abe0458e4d87559c689a8c306d0957ece5/requests_toolbelt-0.9.1-py2.py3-none-any.whl#sha256=380606e1d10dc85c3bd47bf5a6095f815ec007be7a8b69c878507068df059e6f (from twine==3.1.0->-r /tmp/pipenv-pbslpsa_-requirements/pipenv-u629hk8s-requirement.txt (line 1))
secretstorage; sys_platform == "linux" from https://files.pythonhosted.org/packages/82/59/cb226752e20d83598d7fdcabd7819570b0329a61db07cfbdd21b2ef546e3/SecretStorage-3.1.1-py3-none-any.whl#sha256=7a119fb52a88e398dbb22a4b3eb39b779bfbace7e4153b7bc6e5954d86282a8a (from keyring>=15.1->twine==3.1.0->-r /tmp/pipenv-pbslpsa_-requirements/pipenv-u629hk8s-requirement.txt (line 1))
Sie haben die Option "--require-hashes" hinzugefügt, wenn Sie die Pip-Installation intern durchführen. Ich kannte die Existenz nicht, bis ich dieses Protokoll sah, das [Hash-Überprüfungsmodus] zu sein scheint (https://pip.pypa.io/en/stable/reference/pip_install/#hash-checking-mode).
Im --require-hashes-Modus müssen alle Anforderungen ihre Versionen mit == fixiert haben. Diese nicht
Zusammenfassend müssen Sie im Hash-Überprüfungsmodus alle Modulversionen mit ==
angeben! !! Es klingt so. (Englisch Wakaranai)
Erstens ist die fehlerfreie Version des Moduls nicht in der Pipfile angegeben, und das Rätsel vertieft sich nur.
Wenn man sich das Protokoll ansieht, scheint es, dass der Pipenv-Befehl eine Datei generiert, die der Anforderung.txt unter / tmp entspricht, und sie mit der Option -r
ausführt, die an den Befehl pip angehängt ist.
Ich habe mir tatsächlich den Inhalt dieser Dateien angesehen.
Als Methode drücken Sie einfach wiederholt "sudo cp -rf / tmp / pipenv *.", Wenn Sie Pipenv ausführen. Es muss einen besseren Weg geben, aber vorerst.
Wenn Sie sich eine der kopierten Dateien ansehen, sieht es so aus
twine==3.1.0 --hash=sha256:1a87ae3f1e29a87a8ac174809bf0aa996085a0368fe500402196bda94b23aab3 --hash=sha256:ba8ba1b39987f1c22d9162f7dd3b4668388640e5f7158c15226624f88e464836
Hmmm, ich generiere require.txt mit einem Hashwert für jedes Modul und übergebe ihn an die Option -r
.
Ich habe den Hash-Wert überprüft, aber er war derselbe Wert wie die tatsächlich veröffentlichte Datei.
Ich werde versuchen, es in einer von Hand erstellten venv-Umgebung zu installieren, die diese Datei require.txt verwendet.
$ echo -n ' twine==3.1.0 --hash=sha256:1a87ae3f1e29a87a8ac174809bf0aa996085a0368fe500402196bda94b23aab3 --hash=sha256:ba8ba1b39987f1c22d9162f7dd3b4668388640e5f7158c15226624f88e464836' > requirements.txt
$ python3 -m venv venv
$ ./venv/bin/pip install -r requirements.txt --require-hashes
Collecting twine==3.1.0
Using cached https://files.pythonhosted.org/packages/74/45/1016cad7eb7cbda959a701d1dfa88b9118306677018ac3de224a6a6e7751/twine-3.1.0-py3-none-any.whl
Collecting readme-renderer>=21.0
Collecting requests-toolbelt!=0.9.0,>=0.8.0
Collecting tqdm>=4.14
Collecting requests>=2.20
Collecting keyring>=15.1
Collecting importlib-metadata; python_version < "3.8"
Requirement already satisfied: setuptools>=0.7.0 in ./venv/lib/python3.6/site-packages (from twine==3.1.0->-r requirements.txt (line 1)) (42.0.1)
Collecting pkginfo>=1.4.2
ERROR: In --require-hashes mode, all requirements must have their versions pinned with ==. These do not:
readme-renderer>=21.0 from https://files.pythonhosted.org/packages/c3/7e/d1aae793900f36b097cbfcc5e70eef82b5b56423a6c52a36dce51fedd8f0/readme_renderer-24.0-py2.py3-none-any.whl#sha256=c8532b79afc0375a85f10433eca157d6b50f7d6990f337fa498c96cd4bfc203d (from twine==3.1.0->-r requirements.txt (line 1))
requests-toolbelt!=0.9.0,>=0.8.0 from https://files.pythonhosted.org/packages/60/ef/7681134338fc097acef8d9b2f8abe0458e4d87559c689a8c306d0957ece5/requests_toolbelt-0.9.1-py2.py3-none-any.whl#sha256=380606e1d10dc85c3bd47bf5a6095f815ec007be7a8b69c878507068df059e6f (from twine==3.1.0->-r requirements.txt (line 1))
tqdm>=4.14 from https://files.pythonhosted.org/packages/bb/62/6f823501b3bf2bac242bd3c320b592ad1516b3081d82c77c1d813f076856/tqdm-4.39.0-py2.py3-none-any.whl#sha256=5a1f3d58f3eb53264387394387fe23df469d2a3fab98c9e7f99d5c146c119873 (from twine==3.1.0->-r requirements.txt (line 1))
requests>=2.20 from https://files.pythonhosted.org/packages/51/bd/23c926cd341ea6b7dd0b2a00aba99ae0f828be89d72b2190f27c11d4b7fb/requests-2.22.0-py2.py3-none-any.whl#sha256=9cf5292fcd0f598c671cfc1e0d7d1a7f13bb8085e9a590f48c010551dc6c4b31 (from twine==3.1.0->-r requirements.txt (line 1))
keyring>=15.1 from https://files.pythonhosted.org/packages/b1/08/ad1ae7262c8146bee3be360cc766d0261037a90b44872b080a53aaed4e84/keyring-19.2.0-py2.py3-none-any.whl#sha256=f5bb20ea6c57c2360daf0c591931c9ea0d7660a8d9e32ca84d63273f131ea605 (from twine==3.1.0->-r requirements.txt (line 1))
importlib-metadata; python_version < "3.8" from https://files.pythonhosted.org/packages/f6/d2/40b3fa882147719744e6aa50ac39cf7a22a913cbcba86a0371176c425a3b/importlib_metadata-0.23-py2.py3-none-any.whl#sha256=d5f18a79777f3aa179c145737780282e27b508fc8fd688cb17c7a813e8bd39af (from twine==3.1.0->-r requirements.txt (line 1))
pkginfo>=1.4.2 from https://files.pythonhosted.org/packages/e6/d5/451b913307b478c49eb29084916639dc53a88489b993530fed0a66bab8b9/pkginfo-1.5.0.1-py2.py3-none-any.whl#sha256=a6d9e40ca61ad3ebd0b72fbadd4fba16e4c0e4df0428c041e01e06eb6ee71f32 (from twine==3.1.0->-r requirements.txt (line 1))
Oh! Ich habe es reproduziert!
Der Fehler liegt jedoch in einem anderen Modul als dem in den Anforderungen.txt beschriebenen ...
In diesem Hash-Überprüfungsmodus müssen alle abhängigen Pakete durch Angabe der Version beschrieben werden. Aber warum erhalten Sie keine Fehlermeldung, wenn Sie normalerweise "pipenv install" ausführen?
Nachdem ich das Protokoll eine Weile überprüft hatte, stellte ich fest, dass es bei der Installation mit pip die Option "--no-deps" hat, wenn es ordnungsgemäß funktioniert.
$ ['/hoge/.venv/bin/pip', 'install', '--verbose', '--upgrade', '-r', '/tmp/pipenv-9owwlzhi-requirements/pipenv-65yqxf03-requirement.txt', '-i', 'https://pypi.org/simple', '--require-hashes']
$ ['/hoge/.venv/bin/pip', 'install', '--verbose', '--upgrade', '--no-deps', '-r', '/tmp/pipenv-5dvxlnyt-requirements/pipenv-pvatvj5c-requirement.txt', '-i', 'https://pypi.org/simple', '--require-hashes']
Oh, so sieht es aus!
--no-deps
ist Installieren Sie keine Paketabhängigkeiten .
Mit anderen Worten, es ist eine Option, die keine abhängigen Pakete installiert.
Naruhode Wenn dies der Fall ist, scheint die zuvor erwähnte Anforderung.txt normal zu funktionieren.
$ ./venv/bin/pip install -r requirements.txt --require-hashes --no-deps
Collecting twine==3.1.0
Using cached https://files.pythonhosted.org/packages/74/45/1016cad7eb7cbda959a701d1dfa88b9118306677018ac3de224a6a6e7751/twine-3.1.0-py3-none-any.whl
Installing collected packages: twine
Successfully installed twine-3.1.0
erledigt.
Die Ursache wurde nach und nach erfasst.
Das einzige verbleibende Rätsel ist ** Warum haben Sie die Option --no-deps
nicht hinzugefügt **?
Am Ende habe ich keine andere Wahl, als die Quelle von Pipenv zu lesen.
https://github.com/pypa/pipenv
Mal sehen, wo der Befehl pip install ...
tatsächlich ausgeführt wird, wenn der Befehl pipenv install
ausgeführt wird.
Der Ort, an dem der Befehl pip tatsächlich ausgeführt wird, war die Funktion pip_install
in pipenv / core.py
.
Es gab verschiedene Aufrufaufträge wie "do_install-> do_init-> do_install_dependencies-> batch_install-> pip_install", aber ...
Zusammenfassend wurde der folgende Teil der Funktion "batch_install" markiert, ob die Option "--no-deps" hinzugefügt werden soll oder nicht.
if not PIPENV_RESOLVE_VCS and is_artifact and not dep.editable:
install_deps = True
no_deps = False
dep ist eine Klasse, die Informationen zu den zu installierenden Modulen enthält.
Nicht PIPENV_RESOLVE_VCS
, is_artifact
und das Modul ist nicht editierbar
...
Ich verstehe überhaupt nicht
Irgendwie scheinen "von der Quelle installierte Module, die nicht als bearbeitbar gekennzeichnet sind" mit dem Hinzufügen von "--no-deps" in Zusammenhang zu stehen.
Nach pipenv install -h
gab es so etwas.
$ pipenv install -h
Abkürzung
-e, --editable TEXT An editable python package URL or path, often to a
VCS repo.
Ah,,,
Schauen wir uns noch einmal die Pipfile an, die den Fehler verursacht hat.
[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true
[dev-packages]
flake8 = "*"
autopep8 = "*"
isort = "*"
autoflake = "*"
pytest = "*"
pytest-cov = "*"
qiitacli = {path = "."}
twine = "*"
sphinx = "*"
sphinx-git = "*"
pypandoc = "*"
[packages]
click = ">=7.0"
qiita_v2 = ">=0.2.1"
[requires]
python_version = "3"
[scripts]
main = "python qiitacli/client.py"
Ja, die Ursache ist
qiitacli = {path = "."}
Es war dieser Typ.
Ich habe bei der Installation eines Moduls, das lokal entwickelt wird, "pipenv install." Durchgeführt, aber dies war ein Problem. Die richtige Antwort lautet "pipenv install -e". Das resultierende Pipfile sieht so aus.
qiitacli = {editable = true,path = "."}
Es hat eine bearbeitbare Flagge.
In diesem Zustand ist die Installation normal abgeschlossen.
Früher habe ich es mit der Option -e richtig eingefügt, aber nachdem mir klar wurde, dass ich es ohne die Option installieren kann, habe ich beschlossen, es so zu installieren, wie es ist. (Vielleicht)
Übrigens war es fest im offiziellen Dokument geschrieben. https://pipenv-ja.readthedocs.io/ja/translate-ja/basics.html#editable-dependencies-e-g-e
Lassen Sie uns zumindest die Bedeutung der von uns verwendeten Optionen verstehen. mich selber.
Recommended Posts