Denken Sie daran, dass es beim Rechnen für ein Problem normalerweise mehrere Lösungen gibt, genauso wie wir die optimalste und effizienteste teilen.
Lösung:
Ich habe viel gesucht und konnte herausfinden, dass Ihnen die crypto.dll fehlt. crypto.dll
Datei. Ihr Code sucht nach dieser dll-Datei und kann sie nicht finden.
Bitte beachten Sie, dass dies nicht installiert wird von pip install crypto
da es sich um eine Python-Bibliothek handelt und der Code nach einer dll-Datei sucht.
ctypes.util.find_library
sucht nach der dll-Datei in der Windows-Umgebungspfadvariable.
Referenz: find_library() in ctypes
Um das zu überprüfen, habe ich überprüft.
find_library('l2gpstore')
>>'C:\WINDOWS\system32\l2gpstore.dll'
find_library('java')
>>'C:\Program Files\Java\jdk-9.0.4\bin\java.dll'
Außerdem sollten Sie installieren OpenSSL
mit . libcrypto
Modul von hier aus
OpenSSL
OpenSSL-Installationsanweisungen
Die Hauptquellen werden in unserem Git-Repository verwaltet, das
über das Netzwerk zugänglich ist und auf GitHub geklont wird, unter
https://github.com/openssl/openssl. Bugs und Pull-Patches (Issues und
Pull Requests) sollten im GitHub-Repository abgelegt werden. Bitte machen Sie sich mit
Sie sich mit der Lizenz vertraut.
libcrypto in Bezug auf OpenSSL
Referenz : GitHub
libcrypto (mit plattformspezifischer Benennung):
Bietet allgemeine kryptographische und X.509-Unterstützung, die von SSL/TLS benötigt wird, aber
nicht logisch Teil davon.
Nach der Installation der Binärdateien und der Überprüfung der crypto.dll
in einer der Pfadzeichenketten in Ihren Umgebungsvariablen verfügbar ist, sollte dieses Problem behoben sein.
Wenn nicht, fügen Sie es in die Pfadvariable ein und überprüfen Sie es.
Aktualisieren:
Aktualisieren, da die Frage aktualisiert wurde und das Problem erneut aufgetreten ist.
Es gibt architektonische Änderungen bei OpenSSL 1.1.0 im Vergleich zu 1.0.2
13. September 2018 - OpenSSL 1.1.0 und spätere Versionen unterscheiden sich deutlich von früheren Versionen. Benutzer sollten für maximale Anwendungskompatibilität BEIDE Versionen, die 1.0.2-Serie (LTS) und die 1.1.1-Serie (LTS), installieren. Entwickler müssen ihre Software neu kompilieren, um 1.1.1 zu unterstützen. Weitere Details finden Sie im offiziellen OpenSSL-Release-Strategie-Dokument. - Prateek gestern
Wenn du 1.0.2 von Github öffnest, kannst du sehen crypto.h
Datei, die gleiche Datei fehlt in der neuesten Version. Auch . OpenSSL
gibt es eine Änderung in DLL
Namen, sie wurden umbenannt in libeay32
in libcrypto
Sie müssen einen Code veröffentlichen, der die asn1crypto
Bibliothek in dem Beitrag verwendet. Es gibt keinen Code, der asn1crypto explizit in Ihrem Beitrag verwendet. Daher kann ich Ihr Problem nicht reproduzieren, wenn ich pipenv
.
Stellen Sie sicher, dass Sie auch aktualisierte Bibliotheken verwenden.
I würde nicht empfehlen DLL-Quelle von einer unzuverlässigen Quelle wie DLLdownloader herunterzuladen.
Wenn Sie Probleme mit der neuesten Version von OpenSSL
und asn1crypto
ist es besser, ein Downgrade durchzuführen OpenSSL
auf 1.0.2
Ich denke, das würde funktionieren, da es mit crypto.h
Datei.
Viel Glück!
Ich habe versucht, den Fehler auf meinem Rechner zu reproduzieren und war erfolgreich, als ich die "fehlerverursachende" Datei ausgeführt habe _big_num_ctypes.py
. Ich habe zwar kein Visual Studio, aber der Fehler rührt von der fehlenden crypto.dll
Datei. Wir werden dies Schritt für Schritt herausfinden. Untersuchen wir zunächst den fehlerverursachenden Codeschnipsel in der Datei _big_num_ctypes.py
:
#imports
from ctypes.util import find_library
.
.
from .._ffi import LibraryNotFoundError, FFIEngineError
try:
# On Python 2, the unicode string here may raise a UnicodeDecodeError as it
# tries to join a bytestring path to the unicode name "crypto"
libcrypto_path = find_library(b'crypto' if sys.version_info < (3,) else 'crypto')
if not libcrypto_path:
raise LibraryNotFoundError('The library libcrypto could not be found')
.
.
except (AttributeError):
raise FFIEngineError('Error initializing ctypes')
Ich habe die Datei ausgeführt:
C:>cd "C:ProgramDataAnaconda3Libsite-packagesasn1crypto_perf"
C:ProgramDataAnaconda3Libsite-packagesasn1crypto_perf>python _big_num_ctypes.py
und hatte einen Traceback
für den Import der Bibliothek:
Traceback (most recent call last):
File "_big_num_ctypes.py", line 27, in
from .._ffi import LibraryNotFoundError, FFIEngineError
ValueError: attempted relative import beyond top-level package
Ich änderte also den Importpfad für .ffi
zu:
from asn1crypto._ffi import LibraryNotFoundError, FFIEngineError
Beim zweiten Durchlauf erschien der Fehler mit der fehlenden libcrypto-Bibliothek:
asn1crypto._ffi.LibraryNotFoundError: The library libcrypto could not be found
Die Ausnahme wird ausgelöst, wenn die dll . Bibliothek namens Krypto konnte unter C:WindowsSystem32 und/oder SYSWOW64 (für 64-Bit) nicht gefunden werden
libcrypto_path = find_library(b'crypto' if sys.version_info < (3,) else 'crypto')
Der Zweck von find_library
ist es, eine bestimmte Bibliothek zu finden und einen Pfadnamen zurückzugeben. Das Verhalten dieser Methode variiert je nach Betriebssystem, wie in den Dokumenten beschrieben. Wenn diese Methode keine Pakete finden kann, gibt sie None
.
>>> from ctypes.util import find_library
>>> print(find_library("c"))
None
In unserem Fall ist die Suche nach crypto.dll
und ich konnte diese Datei auf meinem Computer nicht finden. Also habe ich sie heruntergeladen und genau nach den Anweisungen hier installiert. Als ich erneut nachsah, fand ich die Datei
>>> find_library('crypto')
'C:\windows\system32\crypto.dll'
Jetzt habe ich python _big_num_ctypes.py
erneut aus und erhielt eine andere Traceback
:
Traceback (most recent call last):
File "_big_num_ctypes.py", line 37, in
libcrypto = CDLL(libcrypto_path)
File "C:ProgramDataAnaconda3libctypes__init__.py", line 348, in __init__
self._handle = _dlopen(self._name, mode)
OSError: [WinError 193] %1 is not a valid Win32 application
Eine weitere Untersuchung des obigen Fehlers ergab, dass, wenn ich eine 32-Bit-DLL mit 64-Bit-Python verwende, oder umgekehrt, dann kann ich solche Fehler wie hier beschrieben bekommen. Ich installierte also Python 3.6 32-bit und versuchte es erneut mit py -3.6-32 _big_num_ctypes.py
. Ich habe auch alle erforderlichen Pakete installiert, aber dieser Fehler blieb bestehen.
Könnte es sein, dass wir 32-Bit-Binärpakete für die Crypto
Paket benötigen? Diese Antwort und diese geben mehr Informationen.
Ich habe festgestellt, dass Pycryptodome ein regelmäßig gewartetes Paket ist und dem alten vorgezogen wird Crypto
Paket bevorzugt wird, aber immer noch installiert werden kann unter Crypto
. Ein weiterer Punkt, der zu beachten ist, ist, dass eine der Anforderungen für dieses Paket MS Visual Studio 2015 (Community Edition) und die C/C++-Compiler und die verteilbaren nur ist. Es könnte sein, dass einige C++-Compilerdateien oder MS Visual Studio-Dateien derzeit fehlen und diese Probleme verursachen.
Wenn Sie alle oben genannten Voraussetzungen installieren, wird die crypto.dll
Datei und die Pycryptodome
Paket installiert haben, wird dieser Fehler vermutlich behoben sein. Sie haben bereits andere erforderliche Pakete installiert OpenSSL
& Twilio
. Leider kann ich MS Visual Studio nicht auf meinem Computer installieren und konnte dies daher nicht weiter testen.
Ich habe auch die unittest
Code und es lief erfolgreich für mich:
#Output
.
----------------------------------------------------------------------
Ran 1 test in 0.771s
OK
Wenn Sie diesen Artikel beenden, können Sie die Abmessungen anderer Entwickler finden, Sie haben auch die Freiheit, Ihre zu verlassen, wenn Sie möchten.