注:これはVisual Studioの問題ではなく、互換性のないdllバージョンの問題です。 Visual Studioをデバッグモードで実行すると、例外がスローされると中断するため、以下の手順で問題が再現されます。実行したばかりの場合、スローされた例外は他の場所で処理され、プログラムは正常に機能します。しかし、私はデバッグモードで多くの時間を費やしているので、この問題を修正したいと思います。
デバッグするときに、VisualStudioの仮想環境に追加したモジュールにステップインできるようにしたいです。修正できない「ライブラリが見つかりません」というエラーが表示されます。手順は次のとおりです。
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
の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()
以前と同様に、インポート行は例外をスローしますが、例外はキャッチされず、「except」句の行はtwilio.restインポートクライアントから実行されません。
更新2:@Prateekと@ user8212173に続いて、どういうわけかこれが機能するようになりました。しかし、今では再び機能していません。両方が示唆しているように、問題はcrypto.dllがそこにないことです。そこで、以下の手順を実行して追加しましたが、成功しませんでした。
たくさん検索したところ、crypto.dll
ファイルが見つからないことがわかりました。コードがこのdllファイルを探していますが、見つかりません。
これはpythonライブラリであり、コードはdllファイルを探しているため、これはpip install crypto
によってインストールされないことに注意してください。
ctypes.util.find_library
は、Windows環境パス変数からdllファイルを検索します。
確認するために確認しました。
find_library('l2gpstore')
>>'C:\\WINDOWS\\system32\\l2gpstore.dll'
find_library('Java')
>>'C:\\Program Files\\Java\\jdk-9.0.4\\bin\\Java.dll'
さらに、ここからOpenSSL
モジュールとともにlibcrypto
をインストールする必要があります
マスターソースは、ネットワーク経由でアクセスでき、GitHubの https://github.com/openssl/openssl に複製されているgitリポジトリに保持されています。バグとプルパッチ(問題とプルリクエスト)は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
ファイルが表示されますが、最新バージョンでは同じファイルがありません。また、OpenSSL
DLL
の名前に変更があり、それらは libeay32
の名前をlibcrypto
に変更
投稿でasn1crypto
ライブラリを利用するコードを投稿する必要があります。投稿でasn1cryptoを明示的に使用するコードはありません。そのため、pipenv
を使用して問題を再現することはできません。
更新されたライブラリも使用していることを確認してください。
私はお勧めしませんダウンロードDLLソースを信頼できないソースから DLLdownloader
最新バージョンのOpenSSL
とasn1crypto
で問題が発生した場合は、OpenSSL
を1.0.2
にダウングレードすることをお勧めします。これは、crypto.h
ファイルに付属していることを考えるとうまくいくと思います。
幸運を!
コンピューターでエラーを再現しようとしましたが、「エラーを生成する」ファイル_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
ファイルおよびPycryptodome
packageをインストールすると、このエラーは解決されると思います。他の必要なパッケージOpenSSL
&Twilio
はすでにインストールされています。残念ながら、コンピューターへのMS Visual Studioのインストールは制限されているため、これ以上テストすることはできませんでした。
また、unittest
コードを実行しましたが、正常に実行されました。
#Output
.
----------------------------------------------------------------------
Ran 1 test in 0.771s
OK
これが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 \の下にあります