Примечание. Это не проблема 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?