gpt4 book ai didi

python - 在 64 位 Windows 上从哪里获取和安装 crypto.dll

转载 作者:太空狗 更新时间:2023-10-29 17:19:52 26 4
gpt4 key购买 nike

注意:这不是 Visual Studio 的问题,而是不兼容的 dll 版本的问题。下面的步骤复制了这个问题,因为在 Debug模式下在 Visual Studio 中运行会因抛出异常而中断。如果你只是运行,抛出的异常在别处处理,程序运行正常。但由于我在 Debug模式下花费了很多时间,所以我更愿意解决这个问题。

调试时,我希望能够单步执行已添加到 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 文件的顶部:

    从 twilio.rest 导入客户端

  2. 在 Visual Studio 中,转到工具 > 选项 > python > 调试。制作确保选中“启用 Python 标准库调试”

  3. 运行应用程序。您收到以下错误:

ModuleNotFoundError: No module named '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:找不到库 libcrypto

错误在 asn1crypto 中名为 _big_num_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')

更新:我被要求提供完整的回溯。我这样修改代码来打印:

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()

与之前导入行抛出异常但未捕获异常并且永远不会执行“except”子句中的行从 twilio.rest 导入客户端

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

  1. 我从 https://slproweb.com/products/Win32OpenSSL.html 安装了 Win64 OpenSSL v1.1.0j (指向来自 https://wiki.openssl.org/index.php/Binaries )。它不包含 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?

最佳答案

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

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

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

Reference : find_library() in ctypes

为了验证我检查过。

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

OpenSSL 安装instructions

The master sources are maintained in our git repository, which is accessible over the network and cloned on GitHub, at https://github.com/openssl/openssl. Bugs and pull patches (issues and pull requests) should be file on the GitHub repo. Please familiarize yourself with the license.

关于 OpenSSL 的 libcrypto

reference : GitHub

libcrypto (with platform specific naming): Provides general cryptographic and X.509 support needed by SSL/TLS but not logically part of it.

安装二进制文件并检查 crypto.dll 在环境变量的路径字符串之一中可用后,此问题应该得到解决。

如果没有将其添加到路径变量中并检查。

更新:

更新,因为问题已经更新,问题又出现了。

与 1.0.2 相比,OpenSSL 1.1.0 的架构发生了变化

September 13, 2018 - OpenSSL 1.1.0 and later are quite different from previous releases. Users should install BOTH the 1.0.2 series (LTS) and the 1.1.1 (LTS) series for maximum application compatibility. Developers need to recompile their software to support 1.1.1. See the official OpenSSL release strategy document for more details. – Prateek yesterday

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

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

确保您也使用更新的库。

不建议从不可靠的来源下载 DLL 源,例如 DLLdownloader


如果您在使用最新版本的 OpenSSLasn1crypto 时遇到问题,最好将 OpenSSL 降级到 1.0.2 ,考虑到它随 crypto.h 文件一起提供,我认为这会起作用。

祝你好运!

关于python - 在 64 位 Windows 上从哪里获取和安装 crypto.dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49302516/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com