在64位Windows上获取并安装crypto.dll的位置

Bar*_*rka 14 python dll openssl python-import python-3.x

注意:这不是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' -----
Run Code Online (Sandbox Code Playgroud)
  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' -----
Run Code Online (Sandbox Code Playgroud)
  1. 运行该应用程序.您收到以下错误:

    asn1crypto._ffi.LibraryNotFoundError: The library libcrypto could not be found

该错误将在名为的文件_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')
Run Code Online (Sandbox Code Playgroud)

更新:我被要求提供完整的回溯.我用这种方式修改代码来打印它:

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()
Run Code Online (Sandbox Code Playgroud)

和导入行一样抛出异常,但是没有捕获异常,并且'except'子句中的行永远不会从twilio.rest import客户端执行

更新2:我以某种方式在@Prateek和@ user8212173之后开始工作.但现在它不再起作用了.正如两者所建议的那样,问题是crypto.dll不存在.所以我通过以下步骤添加它没有成功:

  1. 我从https://slproweb.com/products/Win32OpenSSL.html (指向https://wiki.openssl.org/index.php/Binaries)安装了Win64 OpenSSL v1.1.0j .它不包含crypto.dll.
  2. 然后我从http://www.dlldownloader.com/crypto-dll/安装了crypto.dll (如@ user8212173建议)(只有32位版本)并按照说明操作.然后我收到一条新的错误消息"ImportError:DLL加载失败:%1不是一个有效的Win32应用程序",这意味着我安装的crypto.dll存在版本冲突(我在64位计算机上运行64位python).我记得从Unofficial Windows Binaries for Python Extension Packages安装它我找不到它.那么我在哪里可以获得64位版本的crypto.dll?

Pra*_*eek 5

我搜索了很多,发现你丢失了crypto.dll文件.您的代码正在查找此dll文件,但无法找到它.

请注意这不会安装,pip install crypto因为这是python库,代码正在寻找一个DLL文件.

ctypes.util.find_library 从windows环境路径变量中搜索dll文件.

参考:ctypes中的find_library()

验证我检查了.

find_library('l2gpstore')
>>'C:\\WINDOWS\\system32\\l2gpstore.dll'
find_library('java')
>>'C:\\Program Files\\Java\\jdk-9.0.4\\bin\\java.dll'
Run Code Online (Sandbox Code Playgroud)

此外,您还应该安装OpenSSLlibcrypto模块从这里

OpenSSL的

OpenSSL安装说明

主源维护在我们的git存储库中,该存储库可通过网络访问并克隆到GitHub上,网址https://github.com/openssl/openssl.错误和拉取补丁(问题和拉取请求)应该是GitHub仓库中的文件.请熟悉许可证.

关于OpenSSL的libcrypto

参考:GitHub

libcrypto(具有特定于平台的命名):提供SSL/TLS所需的一般加密和X.509支持,但逻辑上不是它的一部分.

安装二进制文件并crypto.dll在环境变量中的某个路径字符串中提供检查后,应解决此问题.

如果没有将它添加到路径变量并检查.

更新:

更新问题已更新,问题再次出现.

与1.0.2相比,OpenSSL 1.1.0存在架构方面的变化

2018年9月13日 - OpenSSL 1.1.0及更高版本与以前的版本完全不同.用户应安装1.0.2系列(LTS)和1.1.1(LTS)系列,以实现最大的应用兼容性.开发人员需要重新编译他们的软件才能支持1.1.1.有关更多详细信息,请参阅官方OpenSSL发布策略文档. - 昨天Prateek

如果从Github打开1.0.2,您可以看到crypto.h文件,最新版本中缺少相同的文件.名称也OpenSSL有变化DLL,他们改名libeay32libcrypto

您需要发布asn1crypto在帖子中使用库的代码.没有代码在您的帖子中明确使用asn1crypto.因此,无法使用重现您的问题pipenv.

确保您也使用更新的库.

不建议从不可靠的源代码DLLdownloader下载DLL源代码


如果您遇到最新版本的问题OpenSSL并且asn1crypto最好降级OpenSSL1.0.2,我认为考虑到它附带crypto.h文件会有效.

祝好运!