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

Python 在64位Windows上获取和安装crypto.dll的位置,python,python-3.x,dll,openssl,python-import,Python,Python 3.x,Dll,Openssl,Python Import,注意:这不是Visual Studio的问题,而是不兼容的dll版本的问题。以下步骤复制了该问题,因为在Visual Studio中以调试模式运行会在引发异常时中断。如果您只是运行,抛出的异常将在其他地方处理,并且程序工作正常。但由于我在调试模式下花费了大量时间,所以我更愿意解决这个问题 调试时,我希望能够逐步进入我在VisualStudio中添加到虚拟环境中的模块。我收到一个无法修复的“未找到库”错误。以下是步骤: 在VisualStudio中创建一个新的Python应用程序 为该应用程序创建

注意:这不是Visual Studio的问题,而是不兼容的dll版本的问题。以下步骤复制了该问题,因为在Visual Studio中以调试模式运行会在引发异常时中断。如果您只是运行,抛出的异常将在其他地方处理,并且程序工作正常。但由于我在调试模式下花费了大量时间,所以我更愿意解决这个问题

调试时,我希望能够逐步进入我在VisualStudio中添加到虚拟环境中的模块。我收到一个无法修复的“未找到库”错误。以下是步骤:

  • 在VisualStudio中创建一个新的Python应用程序
  • 为该应用程序创建虚拟环境(Python 3.6 64 位)
  • pip将twilio安装到虚拟环境中。你得到了
    跟踪输出
  • 运行应用程序。您将得到以下错误:

    asn1crypto.\u ffi.LibraryNotFoundError:找不到库libcrypto

  • 错误被抛出到
    asn1crypto
    中名为
    \u big\u num\u ctypes.py
    的文件中。引发此问题的代码行是:

    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'子句中的行 从twilio.rest导入客户端

    更新2:在@pratek和@user8212173之后,我不知何故让它起到了作用。但现在它不再起作用了。正如两人所建议的,问题在于crypto.dll不存在。因此,我通过以下步骤添加它,但没有成功:

  • 我从安装了Win64 OpenSSL v1.1.0j(指向)。它不包含crypto.dll
  • 然后我从安装了crypto.dll(正如@user8212173所建议的那样)(只有一个32位版本),并按照说明进行了操作。然后,我收到一条新的错误消息“ImportError:DLL加载失败:%1不是有效的Win32应用程序”,这意味着我安装的crypto.DLL存在版本冲突(我正在64位计算机上运行64位python)。我记得是从那里安装的,我在那里找不到。那么,从哪里可以获得64位版本的crypto.dll

  • 我搜索了很多,发现您缺少
    crypto.dll
    文件。您的代码正在查找此dll文件,但找不到它

    请注意,
    pip install crypto
    不会安装此文件,因为这是python库,代码正在查找dll文件

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

    为了验证我检查过了

    find_library('l2gpstore')
    >>'C:\\WINDOWS\\system32\\l2gpstore.dll'
    find_library('java')
    >>'C:\\Program Files\\Java\\jdk-9.0.4\\bin\\java.dll'
    
    此外,您应该从这里使用
    libcrypto
    模块安装
    OpenSSL

    OpenSSL安装 主源代码保存在我们的git存储库中,即 可通过网络访问并在GitHub上克隆,位于 . bug和拉补丁(问题和解决方案) 拉请求)应该是GitHub repo上的文件。请熟悉 你自己拿着执照

    关于OpenSSL的libcrypto

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

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

    如果没有,则将其添加到path变量中并进行检查

    更新: 更新,因为问题已更新且问题已再次出现

    与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发布策略文档普拉蒂克昨天

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

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

    确保您也在使用更新的库

    我不建议从不可靠的源下载DLL源,如


    如果您对最新版本的
    OpenSSL
    asn1crypto
    有问题,最好将
    OpenSSL
    降级到
    1.0.2
    ,考虑到它附带
    crypto.h
    文件,我认为这会起作用


    祝你好运

    我试图在我的计算机上重现错误,当我运行“错误生成”文件
    \u big\u num\u ctypes.py
    时成功了。虽然我没有Visual Studio,但错误源于缺少
    crypto.dll
    文件。我们将一步一步地推演。让我们首先检查文件
    \u big\u num\u 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')
    
    并对库导入进行了
    回溯

    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
    
    在第二次运行时,出现丢失的libcrypto库错误:

    asn1crypto._ffi.LibraryNotFoundError: The library libcrypto could not be found
    
    当在C:\Windows\System32和/或SYSWOW64(对于64位)上找不到名为crypto的dll库时,会引发异常

    在我们的例子中,搜索的是
    crypto.dll
    ,我在我的计算机上找不到这个文件。所以,我完全按照说明下载并安装了它。当我再次检查时:

     >>> find_library('crypto')
    'C:\\windows\\system32\\crypto.dll'
    
    现在我再次运行了
    python\u big\u num\u ctypes.py
    ,得到了一个不同的
    回溯

        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
    

    这是我针对windows 10的解决方案,visual studio社区2017

    打开文件C:\Program Files(x86)\Microsoft Visual Studio\Shared\Python36\u 64\Lib\site packages\asn1crypto\u perf\u big\u num\u ctypes.py,然后打开C
    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
    
    from asn1crypto._ffi import LibraryNotFoundError, FFIEngineError
    
    asn1crypto._ffi.LibraryNotFoundError: The library libcrypto could not be found
    
    libcrypto_path = find_library(b'crypto' if sys.version_info < (3,) else 'crypto')
    
    >>> from ctypes.util import find_library
    >>> print(find_library("c"))
    None
    
     >>> find_library('crypto')
    'C:\\windows\\system32\\crypto.dll'
    
        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
    
    #Output
    
    .
    ----------------------------------------------------------------------
    Ran 1 test in 0.771s
    
    OK
    
    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')