[PYTHON] Die Geschichte, dass ein Hash-Fehler bei der Verwendung von Pipenv auftrat

Was ist das

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.

Eines Tages, als ich Pipenv benutzte, bemerkte ich einen mysteriösen Fehler

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

Schauen Sie sich das Pipfile an

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

Schauen Sie sich das Protokoll an

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.

Schauen Sie sich die Datei resources.txt an

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?

Was ist --no-deps

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 **?

Der letzte Schlüssel kann bearbeitet werden

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,,,

Lösung

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.

Zusammenfassung

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

Die Geschichte, dass ein Hash-Fehler bei der Verwendung von Pipenv auftrat
Eine Geschichte, die praktisch war, als ich versuchte, das Python-IP-Adressmodul zu verwenden
[Linux / GCP] Umgang mit Fehlern, die bei Verwendung des Git-Befehls aufgetreten sind
Eine Geschichte, wenn ein Verzeichnis mit dem Befehl django-admin start project in einer virtuellen Umgebung mit Pipenv fehlerhaft ist
Eine süchtig machende Geschichte bei der Verwendung von Tensorflow unter Android
Generieren Sie Hash-Werte mit der HMAC-Methode.
Es ist eine Huckepack-Geschichte über den Dienst, der "Nyan" zurückgibt, wenn Sie Ping drücken
Eine Geschichte, die fehlgeschlagen ist, als versucht wurde, das Suffix mit rstrip aus einem String zu entfernen
Eine Geschichte, die beim Versuch, die Python-Version mit GCE zu aktualisieren, hängen blieb
Die Geschichte, eine harte Zeit mit der gemeinsamen Menge HTTP_PROXY = ~ zu haben
Eine Geschichte über einen Fehler, wenn PyInstaller in einem Programm verwendet wird, das googleapiclient verwendet
Es gibt ein Muster, das das Programm bei Verwendung von Python-Threading nicht gestoppt hat
Eine Geschichte, die die Lieferung von Nico Nama analysierte.
Eine Geschichte, die es einfach macht, den Wohnbereich mit Elasticsearch und Python abzuschätzen
Eine Geschichte, die stolperte, als ich mit Transformer einen Chat-Chat-Bot erstellte
Bei Verwendung von JUMAN ++ mit PyKNP ist ein Wertefehler aufgetreten
Eine Geschichte über die Installation von matplotlib mit pip mit einem Fehler
Die Geschichte des Erstellens einer Datenbank mithilfe der Google Analytics-API
Verwenden Sie bei Verwendung einer Eigenschaft eine Klasse, die ein Objekt erbt (Klasse neuen Stils).
Eine Geschichte, die nicht funktioniert hat, als ich versucht habe, mich mit dem Python-Anforderungsmodul anzumelden
Beim Inkrementieren des Werts eines Schlüssels, der nicht vorhanden ist
Die Geschichte, dass die Homebrew-Umgebung bei der Installation von Anaconda umgehauen wurde
Eine Geschichte, die ich behoben habe, als ich das Lambda-Protokoll von Cloudwatch Logs erhalten habe
Vorsichtsmaßnahmen bei Verwendung einer Liste oder eines Wörterbuchs als Standardargument
Eine Geschichte über einen Erstellungsfehler in einer gemeinsam genutzten Bibliothek, die auf libusb verweist
[Ev3dev] Erstellen Sie ein Programm, das das LCD (Bildschirm) mit Python erfasst
Die Geschichte der Erstellung einer Website, auf der die Veröffentlichungsdaten von Büchern aufgeführt sind
Die Geschichte, dass der Wachmann eingesperrt war, als das Labor auf IoT umgestellt wurde
Die Geschichte, ein Modul zu erstellen, das E-Mails mit Python überspringt
Der Fehler beim Aufrufen des tkinter-Moduls in einem Texteditor funktioniert nicht wie erwartet
Die Geschichte, einen Slackbot zu erstellen, der beim Senden des Verarbeitungscodes ein GIF oder PNG ausgibt
Ein Memorandum bei der Verwendung von schöner Suppe
Vorsichtsmaßnahmen bei Verwendung der Funktion urllib.parse.quote
Die Geschichte der Verwendung von Python reduziert
Die Geschichte des Exportierens eines Programms
Eine Geschichte, die die Gegenwart von Qiita mit Qiita API + Elasticsearch + Kibana visualisiert
Die Geschichte der Entwicklung einer WEB-Anwendung, die automatisch Fangkopien generiert [MeCab]
Schätzen Sie die Wahrscheinlichkeit, dass eine Münze mit MCMC erscheint
Die Geschichte, ein Paket zu erstellen, das den Betrieb von Juman (Juman ++) & KNP beschleunigt
Ein nützlicher Hinweis, wenn Sie Python nach langer Zeit verwenden
Eine Geschichte, die unter einem Unterschied im Betriebssystem litt, als sie versuchte, ein Papier zu implementieren