私は次のコードを使用してpythonでdllをロードしています:
if os.path.exists(dll_path):
my_dll = ctypes.cdll.LoadLibrary(dll_path)
しかし、私は継続的に次のエラーを取得しています
WindowsError:[エラー126]指定されたモジュールが見つかりませんでした
dllは指定されたパスにありますが、エラーが発生する理由がわかりませんでした。
私がこのようなものを見るとき-それは通常、変換されるパスにバックスラッシュがあるためです。
たとえば、文字列の\ tがTAB文字に変換されるため、次は失敗します。
>>> import ctypes
>>> ctypes.windll.LoadLibrary("c:\tools\depends\depends.dll")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "c:\tools\python271\lib\ctypes\__init__.py", line 431, in LoadLibrary
return self._dlltype(name)
File "c:\tools\python271\lib\ctypes\__init__.py", line 353, in __init__
self._handle = _dlopen(self._name, mode)
WindowsError: [Error 126] The specified module could not be found
3つの解決策があります(問題がある場合)
a)二重スラッシュを使用...
>>> import ctypes
>>> ctypes.windll.LoadLibrary("c:\\tools\\depends\\depends.dll")
b)スラッシュを使用する
>>> import ctypes
>>> ctypes.windll.LoadLibrary("c:/tools/depends/depends.dll")
c)RAW文字列を使用します(文字列の前にrを付けます)
>>> import ctypes
>>> ctypes.windll.LoadLibrary(r"c:\tools\depends\depends.dll")
この3つ目は機能しますが、RAW文字列は正規表現のためのものであるため、「正しい」とは見なされないという印象を時々受けています。 Python何年も問題なく:))でWindowsのパスに使用してきました
DLLがパスにある場合でも。そのDLLがパスにない他のDLLに依存している場合、同じエラーが発生する可能性があります。この場合、Windowsは依存関係を見つけることができませんでした。Windowsは、何が見つからなかったかを伝えるのが得意ではなく、何かを見つけられなかっただけです。それを理解するのはあなた次第です。ここ: http://msdn.Microsoft.com/en-us/library/7d83bc18.aspx
私の場合、必要なすべてのdllが同じディレクトリにあることを確認し、そのディレクトリに対してos.chdir()を実行することで問題が解決しました。
Win10 32ビットOSでも同じ問題に遭遇しました。 DLLをデバッグからリリースバージョンに変更することで問題を解決しました。
デバッグバージョンDLL=は他のDLLに依存しており、リリースバージョンは依存していないためだと思います。
https://www.Microsoft.com/en-us/download/details.aspx?id=53587 からMicrosoft Visual C++ 2015 Redistributable Update 3をインストールしてください。
Windowsでは可能です。以下をインストールする必要があります:Visual Studio 2015のVisual C++再頒布可能パッケージ。同じ問題が発生し、両方のバージョン(Windows x86およびWindows x64)をインストールしました。どうやらそれを動作させるために両方が必要です。
さまざまな方法でdllパスを指定しようとしました(@markmによって提案されました)が、私にとっては何もうまくいきませんでした。 DLLをスクリプトフォルダーにコピーすることで問題を修正しました。それは良い解決策ではありませんが、私の目的には問題ありません。
GCCを使用してWindows用にコンパイルしている場合、依存ライブラリが見つからないためにエラーが発生した可能性があります。
GCCとリンクする場合に-staticフラグを使用すると、それが修正される場合があります。
また、Eclipseの作業ディレクトリを、アプリケーションを実行するための正しいローカルに設定するのを忘れている可能性もあります。