web-dev-qa-db-ja.com

64ビットWindowsでcrypto.dllを入手してインストールする場所

注:これはVisual Studioの問題ではなく、互換性のないdllバージョンの問題です。 Visual Studioをデバッグモードで実行すると、例外がスローされると中断するため、以下の手順で問題が再現されます。実行したばかりの場合、スローされた例外は他の場所で処理され、プログラムは正常に機能します。しかし、私はデバッグモードで多くの時間を費やしているので、この問題を修正したいと思います。

デバッグするときに、VisualStudioの仮想環境に追加したモジュールにステップインできるようにしたいです。修正できない「ライブラリが見つかりません」というエラーが表示されます。手順は次のとおりです。

  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.pyasn1cryptoという名前のファイルにスローされます。これがスローされるコード行は次のとおりです。

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. Win64 OpenSSL v1.1.0jを https://slproweb.com/products/Win32OpenSSL.htmlhttps://wiki.openssl.org/index.phpからポイント)からインストールしました/ Binaries )。 crypto.dllは含まれていません。
  2. 次に、 http://www.dlldownloader.com/crypto-dll/ (@ user8212173が提案したように)(32ビットバージョンのみ)からcrypto.dllをインストールし、指示に従いました。次に、新しいエラーメッセージ「ImportError:DLL load failed:%1 is not a valid Win32 application」が表示されました。これは、インストールしたcrypto.dllのバージョンが競合していることを意味します(64ビットを実行しています) python 64ビットコンピューター)-からインストールしたことを覚えています Python拡張パッケージ)の非公式Windowsバイナリ 見つかりませんでは、64ビットバージョンのcrypto.dllはどこで入手できますか?
15
Barka

たくさん検索したところ、crypto.dllファイルが見つからないことがわかりました。コードがこのdllファイルを探していますが、見つかりません。

これはpythonライブラリであり、コードはdllファイルを探しているため、これはpip install cryptoによってインストールされないことに注意してください。

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'

さらに、ここからOpenSSLモジュールとともにlibcryptoをインストールする必要があります

OpenSSL

OpenSSLのインストール 手順

マスターソースは、ネットワーク経由でアクセスでき、GitHubの https://github.com/openssl/openssl に複製されているgitリポジトリに保持されています。バグとプルパッチ(問題とプルリクエスト)はGitHubリポジトリにファイルする必要があります。ライセンスをよく理解してください。

openSSLに関するlibcrypto

参照:GitHub

libcrypto(プラットフォーム固有の命名付き):SSL/TLSに必要な一般的な暗号化およびX.509サポートを提供しますが、論理的にはその一部ではありません。

バイナリをインストールし、環境変数のパス文字列の1つでcrypto.dllが使用可能であることを確認すると、この問題は解決されるはずです。

そうでない場合は、パス変数に追加して確認してください。

更新:

質問が更新され、問題が再発したため、更新してください。

1.0.2と比較してOpenSSL1.1.0ではアーキテクチャが変更されています

2018年9月13日-OpenSSL1.1.0以降は、以前のリリースとはかなり異なります。アプリケーションの互換性を最大化するには、1.0.2シリーズ(LTS)と1.1.1(LTS)シリーズの両方をインストールする必要があります。開発者は、1.1.1をサポートするためにソフトウェアを再コンパイルする必要があります。詳細については、公式のOpenSSLリリース戦略ドキュメントを参照してください。 –昨日のプラテック

Githubから1.0.2を開くと、crypto.hファイルが表示されますが、最新バージョンでは同じファイルがありません。また、OpenSSLDLLの名前に変更があり、それらは libeay32の名前をlibcryptoに変更

投稿でasn1cryptoライブラリを利用するコードを投稿する必要があります。投稿でasn1cryptoを明示的に使用するコードはありません。そのため、pipenvを使用して問題を再現することはできません。

更新されたライブラリも使用していることを確認してください。

はお勧めしませんダウンロードDLLソースを信頼できないソースから DLLdownloader


最新バージョンのOpenSSLasn1cryptoで問題が発生した場合は、OpenSSL1.0.2にダウングレードすることをお勧めします。これは、crypto.hファイルに付属していることを考えるとうまくいくと思います。

幸運を!

5
Prateek

コンピューターでエラーを再現しようとしましたが、「エラーを生成する」ファイル_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

2回目の実行で、libcryptoライブラリが見つからないというエラーが表示されました。

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

cryptoという名前のdllライブラリがC:\ Windows \で見つからなかった場合、例外が発生します。 System32および/またはSYSWOW64(64ビットの場合)

libcrypto_path = find_library(b'crypto' if sys.version_info < (3,) else 'crypto')

find_libraryの目的は、指定されたライブラリを見つけてパス名を返すことです。 docs で説明されているように、このメソッドの動作はOSによって異なります。このメソッドがパッケージを見つけられない場合は、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で使用している場合、またはその逆の場合)、説明されているようなエラーが発生する可能性があることが明らかになりました ここ =。そこで、Python 3.6 32ビットをインストールし、py -3.6-32 _big_num_ctypes.pyで再試行しました。必要なすべてのパッケージもインストールしましたが、このエラーは解決しませんでした。

Cryptoパッケージに32ビットのバイナリが必要になる可能性はありますか? This answer and this より多くの情報を提供します。

Pycryptodome は定期的に保守されるパッケージであり、古いCryptoパッケージよりも優先されますが、Cryptoの下にインストールできることに気付きました。もう1つの注意点は、このパッケージの要件の1つがMS Visual Studio 2015(Community Edition)とC/C++コンパイラであり、再配布のみであるということです。現在、一部のC++コンパイラファイルまたはMSVisual Studioファイルが欠落しており、これらの問題が発生している可能性があります。

上記のすべての前提条件、crypto.dllファイルおよびPycryptodomepackageをインストールすると、このエラーは解決されると思います。他の必要なパッケージOpenSSLTwilioはすでにインストールされています。残念ながら、コンピューターへのMS Visual Studioのインストールは制限されているため、これ以上テストすることはできませんでした。

また、unittestコードを実行しましたが、正常に実行されました。

#Output

.
----------------------------------------------------------------------
Ran 1 test in 0.771s

OK
3
amanb

これがWindows10、ビジュアルスタジオコミュニティ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 \の下にあります

0
jacky zhang