где взять и установить crypto.dll на 64 битной винде

Примечание. Это не проблема Visual Studio, а скорее несовместимые версии dll. Приведенные ниже шаги воспроизводят проблему, поскольку при запуске в Visual Studio в режиме отладки возникают исключения при возникновении исключений. Если вы просто запустите, сгенерированное исключение обрабатывается в другом месте, и программа работает нормально. Но так как я провожу много времени в режиме отладки, я бы предпочел исправить эту проблему.

При отладке я хочу иметь возможность входить в модули, которые я добавил в свою виртуальную среду в Visual Studio. Я получаю ошибку "библиотека не найдена", которую не могу исправить. Вот шаги:

  1. В Visual Studio создайте новое приложение Python.
  2. Создайте виртуальную среду для этого приложения (Python 3.6, 64 бит).
  3. 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' -----
  1. Добавьте следующую строку в начало вашего файла .py:

    from twilio.rest import Client

  2. В Visual Studio зайдите в Инструменты> Параметры> Python> Отладка. Убедитесь, что установлен флажок "Включить отладку стандартной библиотеки Python".

  3. Запустите приложение. Вы получаете следующую ошибку:

ModuleNotFoundError: нет модуля с именем "OpenSSL"

  1. 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' -----
  1. Запустите приложение. Вы получаете следующую ошибку:

    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 не существует. Итак, я прошел через следующие шаги, чтобы добавить его безуспешно:

  1. Я установил Win64 OpenSSL v1.1.0j с https://slproweb.com/products/Win32OpenSSL.html (на который указывает https://wiki.openssl.org/index.php/Binaries). Он не содержит crypto.dll.
  2. Затем я установил 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

Инструкция по установке 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.