где взять и установить crypto.dll на 64 битной винде
Примечание. Это не проблема Visual Studio, а скорее несовместимые версии dll. Приведенные ниже шаги воспроизводят проблему, поскольку при запуске в Visual Studio в режиме отладки возникают исключения при возникновении исключений. Если вы просто запустите, сгенерированное исключение обрабатывается в другом месте, и программа работает нормально. Но так как я провожу много времени в режиме отладки, я бы предпочел исправить эту проблему.
При отладке я хочу иметь возможность входить в модули, которые я добавил в свою виртуальную среду в Visual Studio. Я получаю ошибку "библиотека не найдена", которую не могу исправить. Вот шаги:
- В Visual Studio создайте новое приложение Python.
- Создайте виртуальную среду для этого приложения (Python 3.6, 64 бит).
-
pip install twilio
в вашу виртуальную среду. Вы получите следующий вывод.
...
----- Installing 'twilio' -----
Collecting twilio
Using cached twilio-6.10.5-py2.py3-none-any.whl
Collecting pytz (from twilio)
Using cached pytz-2018.3-py2.py3-none-any.whl
Collecting six (from twilio)
Using cached six-1.11.0-py2.py3-none-any.whl
Collecting PyJWT>=1.4.2 (from twilio)
Using cached PyJWT-1.6.0-py2.py3-none-any.whl
Collecting requests>=2.0.0; python_version >= "3.0" (from twilio)
Using cached requests-2.18.4-py2.py3-none-any.whl
Collecting pysocks; python_version >= "3.0" (from twilio)
Using cached PySocks-1.6.8.tar.gz
Collecting certifi>=2017.4.17 (from requests>=2.0.0; python_version >= "3.0"->twilio)
Using cached certifi-2018.1.18-py2.py3-none-any.whl
Collecting chardet<3.1.0,>=3.0.2 (from requests>=2.0.0; python_version >= "3.0"->twilio)
Using cached chardet-3.0.4-py2.py3-none-any.whl
Collecting urllib3<1.23,>=1.21.1 (from requests>=2.0.0; python_version >= "3.0"->twilio)
Using cached urllib3-1.22-py2.py3-none-any.whl
Collecting idna<2.7,>=2.5 (from requests>=2.0.0; python_version >= "3.0"->twilio)
Using cached idna-2.6-py2.py3-none-any.whl
Installing collected packages: pytz, six, PyJWT, certifi, chardet, urllib3, idna, requests, pysocks, twilio
Running setup.py install for pysocks: started
Running setup.py install for pysocks: finished with status 'done'
Successfully installed PyJWT-1.6.0 certifi-2018.1.18 chardet-3.0.4 idna-2.6 pysocks-1.6.8 pytz-2018.3 requests-2.18.4 six-1.11.0 twilio-6.10.5 urllib3-1.22
----- Successfully installed 'twilio' -----
-
Добавьте следующую строку в начало вашего файла .py:
from twilio.rest import Client
-
В Visual Studio зайдите в Инструменты> Параметры> Python> Отладка. Убедитесь, что установлен флажок "Включить отладку стандартной библиотеки Python".
-
Запустите приложение. Вы получаете следующую ошибку:
ModuleNotFoundError: нет модуля с именем "OpenSSL"
-
pip install pyopenssl
Вы получите следующий вывод:
...
----- Installing 'pyopenssl' -----
Collecting pyopenssl
Using cached pyOpenSSL-17.5.0-py2.py3-none-any.whl
Requirement already satisfied: six>=1.5.2 in c:\users\x\source\repos\pythonapplication9\pythonapplication9\env\lib\site-packages (from pyopenssl)
Collecting cryptography>=2.1.4 (from pyopenssl)
Using cached cryptography-2.1.4-cp36-cp36m-win_amd64.whl
Requirement already satisfied: idna>=2.1 in c:\users\x\source\repos\pythonapplication9\pythonapplication9\env\lib\site-packages (from cryptography>=2.1.4->pyopenssl)
Collecting cffi>=1.7; platform_python_implementation != "PyPy" (from cryptography>=2.1.4->pyopenssl)
Using cached cffi-1.11.5-cp36-cp36m-win_amd64.whl
Collecting asn1crypto>=0.21.0 (from cryptography>=2.1.4->pyopenssl)
Using cached asn1crypto-0.24.0-py2.py3-none-any.whl
Collecting pycparser (from cffi>=1.7; platform_python_implementation != "PyPy"->cryptography>=2.1.4->pyopenssl)
Using cached pycparser-2.18.tar.gz
Installing collected packages: pycparser, cffi, asn1crypto, cryptography, pyopenssl
Running setup.py install for pycparser: started
Running setup.py install for pycparser: finished with status 'done'
Successfully installed asn1crypto-0.24.0 cffi-1.11.5 cryptography-2.1.4 pycparser-2.18 pyopenssl-17.5.0
----- Successfully installed 'pyopenssl' -----
-
Запустите приложение. Вы получаете следующую ошибку:
asn1crypto._ffi.LibraryNotFoundError: The library libcrypto could not be found
Ошибка _big_num_ctypes.py
в файле с именем _big_num_ctypes.py
в asn1crypto
. Строка кода, где это брошено:
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')
Обновление: меня попросили предоставить полную обратную трассировку. Я изменил код таким образом, чтобы напечатать его:
import unittest
import traceback
class Test_test1(unittest.TestCase):
def test_A(self):
try:
from twilio.rest import Client
except Exception as e:
print('foo')
foo = traceback.extract_stack()
traceback.print_exc(e)
if __name__ == '__main__':
unittest.main()
Как и раньше, строка импорта выдает исключение, но исключение не перехватывается, и строки в предложении "кроме" никогда не выполняются из клиента импорта twilio.rest
обновление 2: я как-то заставил это работать после @Prateek и @user8212173. Но теперь это не работает снова. Как оба предположили, проблема в том, что crypto.dll не существует. Итак, я прошел через следующие шаги, чтобы добавить его безуспешно:
- Я установил Win64 OpenSSL v1.1.0j с https://slproweb.com/products/Win32OpenSSL.html (на который указывает https://wiki.openssl.org/index.php/Binaries). Он не содержит crypto.dll.
- Затем я установил crypto.dll с http://www.dlldownloader.com/crypto-dll/ (как предложено @user8212173) (есть только 32-битная версия) и следовал инструкциям. Затем я получил новое сообщение об ошибке "ImportError: сбой загрузки DLL:% 1 не является допустимым приложением Win32", что означает, что у установленного мной crypto.dll есть конфликт версий (я использую 64-битный python на 64-битном компьютере). Я помню, как устанавливал его из неофициальных двоичных файлов Windows для пакетов расширения Python, я не могу найти его там. Итак, где я могу получить рабочую 64-битную версию crypto.dll?
Ответы
Ответ 1
Я много искал и мог обнаружить, что вам не хватает файла crypto.dll
. Ваш код ищет этот файл DLL и не может его найти.
Обратите внимание, что это не будет установлено с помощью pip install crypto
как это библиотека python, и код ищет файл dll.
ctypes.util.find_library
ищет файл dll из переменной пути среды windows.
Ссылка: find_library() в ctypes
Для проверки я проверил.
find_library('l2gpstore')
>>'C:\\WINDOWS\\system32\\l2gpstore.dll'
find_library('java')
>>'C:\\Program Files\\Java\\jdk-9.0.4\\bin\\java.dll'
Кроме того, вы должны установить OpenSSL
с модулем libcrypto
отсюда
OpenSSL
Основные источники хранятся в нашем репозитории git, который доступен по сети и клонирован на GitHub по адресу https://github.com/openssl/openssl. Ошибки и извлечения патчей (проблемы и запросы извлечения) должны храниться в репозитории GitHub. Пожалуйста, ознакомьтесь с лицензией.
libcrypto по отношению к OpenSSL
ссылка: GitHub
libcrypto (с именами, специфичными для платформы): обеспечивает общую криптографическую поддержку и поддержку X.509, необходимые для SSL/TLS, но не логически являющиеся его частью.
После того, как вы установите двоичные файлы и убедитесь, что crypto.dll
доступен в одной из строк пути в переменных среды, эта проблема должна быть решена.
Если нет, добавьте его в переменную пути и проверьте.
Обновить:
Обновление, поскольку вопрос был обновлен, и проблема повторяется.
В OpenSSL 1.1.0 произошли архитектурные изменения по сравнению с 1.0.2
13 сентября 2018 года - OpenSSL 1.1.0 и более поздние версии сильно отличаются от предыдущих выпусков. Пользователи должны установить ОБА серии 1.0.2 (LTS) и серии 1.1.1 (LTS) для максимальной совместимости приложений. Разработчики должны перекомпилировать свое программное обеспечение для поддержки 1.1.1. См. Официальный документ по стратегии релиза OpenSSL для более подробной информации. - Пратик вчера
Если вы откроете 1.0.2 из Github, вы увидите файл crypto.h
, этот файл отсутствует в последней версии. Также в OpenSSL
происходит изменение имен DLL
, они переименованы в libeay32
в libcrypto
Вам нужно опубликовать код, который использует библиотеку asn1crypto
в посте. В вашем сообщении нет кода, который явно использует asn1crypto. Итак, не удалось воспроизвести вашу проблему с помощью pipenv
.
Убедитесь, что вы используете обновленные библиотеки тоже.
Я не рекомендовал бы загружать исходный код DLL из ненадежного источника, такого как DLLdownloader
Если у вас возникли проблемы с последней версией OpenSSL
и asn1crypto
лучше понизить OpenSSL
до 1.0.2
, я думаю, что это будет работать, учитывая, что он поставляется с файлом crypto.h
.
Удачи!
Ответ 2
Я попытался воспроизвести ошибку на моем компьютере и был успешным, когда я запустил файл с ошибкой _big_num_ctypes.py
. Хотя, у меня нет Visual Studio, ошибка проистекает из пропавшего файла crypto.dll
. Мы выведем это шаг за шагом. Сначала рассмотрим ошибку, вызывающую фрагмент кода в файле _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')
Я запустил файл:
C:\>cd "C:\ProgramData\Anaconda3\Lib\site-packages\asn1crypto\_perf"
C:\ProgramData\Anaconda3\Lib\site-packages\asn1crypto\_perf>python _big_num_ctypes.py
и имел Traceback
для импорта библиотеки:
Traceback (most recent call last):
File "_big_num_ctypes.py", line 27, in <module>
from .._ffi import LibraryNotFoundError, FFIEngineError
ValueError: attempted relative import beyond top-level package
Итак, я изменил путь импорта для .ffi
на:
from asn1crypto._ffi import LibraryNotFoundError, FFIEngineError
Во втором запуске появилась ошибка библиотеки libcrypto:
asn1crypto._ffi.LibraryNotFoundError: The library libcrypto could not be found
Исключение возникает, когда библиотека dll с именем crypto не найдена в C:\Windows\System32 и/или SYSWOW64 (для 64-разрядных)
libcrypto_path = find_library(b'crypto' if sys.version_info < (3,) else 'crypto')
Цель find_library
- найти указанную библиотеку и вернуть путь. Поведение этого метода зависит от ОС, как описано в docs. Если этот метод не может найти какие-либо пакеты, он возвращает None
.
>>> from ctypes.util import find_library
>>> print(find_library("c"))
None
В нашем случае поиск выполняется для crypto.dll
, и я не смог найти этот файл на своем компьютере. Итак, я скачал и установил его точно в соответствии с инструкциями здесь. Когда я снова проверил:
>>> find_library('crypto')
'C:\\windows\\system32\\crypto.dll'
Теперь я снова запустил python _big_num_ctypes.py
и получил другой Traceback
:
Traceback (most recent call last):
File "_big_num_ctypes.py", line 37, in <module>
libcrypto = CDLL(libcrypto_path)
File "C:\ProgramData\Anaconda3\lib\ctypes\__init__.py", line 348, in __init__
self._handle = _dlopen(self._name, mode)
OSError: [WinError 193] %1 is not a valid Win32 application
Дальнейшее исследование вышеуказанной ошибки показало, что если я использую 32-битную DLL с 64-битным Python или наоборот, тогда я могу получить такие ошибки, как объяснено здесь. Итак, я установил 32-битный Python 3.6 и снова попытался с помощью py -3.6-32 _big_num_ctypes.py
. Я также установил все необходимые пакеты, но эта ошибка сохранилась.
Возможно ли, что для пакета Crypto
нам могут потребоваться 32-битные двоичные файлы? Этот answer и этот дает больше информации.
Я понял, что Pycryptodome является регулярно поддерживаемым пакетом и является предпочтительным по сравнению с старым пакетом Crypto
, но все еще может быть установлен в Crypto
. Еще один момент, который следует заметить, заключается в том, что одним из требований к этому пакету является MS Visual Studio 2015 (Community Edition) и компиляторы C/С++ и распространяемые только. Возможно, некоторые файлы компилятора С++ или файлы MS Visual Studio в настоящее время отсутствуют и вызывают эти проблемы.
Если вы установите все вышеуказанные предварительные условия, файл crypto.dll
и пакет Pycryptodome
, я считаю, что эта ошибка будет решена. Вы уже установили другие необходимые пакеты OpenSSL
и Twilio
. К сожалению, я ограничен установкой MS Visual Studio на свой компьютер, и поэтому я не мог проверить это дальше.
Я также запускал код unittest
, и он успешно работал у меня:
#Output
.
----------------------------------------------------------------------
Ran 1 test in 0.771s
OK
Ответ 3
Вот мое решение для Windows 10, Visual Studio Community 2017,
откройте файл C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\Lib\site-packages\asn1crypto_perf_big_num_ctypes.py и затем измените код с:
libcrypto_path = find_library(b'crypto' if sys.version_info < (3,) else 'crypto')
чтобы:
libcrypto_path = find_library(b'crypto' if sys.version_info < (3,) else 'libcrypto')
тогда ошибка исчезла.
Файл libcrypto.dll уже находится в папке C:\Windows\System32\
Ответ 4
Могу ли я задать дополнительный вопрос?
Я изменил с 'crypto' на 'libcrypto' в файле '_big_num_ctypes.py'.
Я решил ошибку ниже.
asn1crypto._ffi.LibraryNotFoundError: The library libcrypto could not be found.
Но я столкнулся с другой ошибкой "OpenSSL.SSL.WantReadError".
(путь virtualenv)\Lib\site-packages\OpenSSL\SSL.py
Линия 1620
error = _lib.SSL_get_error(ssl, result)
if error == _lib.SSL_ERROR_WANT_READ:
raise WantReadError()
Я установил OpenSSL как 1.0.2, так и 1.1.1.