1. ホーム
  2. python

[解決済み】WindowsError: [Error 126] 指定されたモジュールが見つかりません。

2022-02-01 20:25:03

質問

Pythonで以下のコードを使ってDLLをロードしています。

if os.path.exists(dll_path):
     my_dll = ctypes.cdll.LoadLibrary(dll_path)

しかし、次のようなエラーが出続けています。

WindowsError: [Error 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上のパスのためにこれを問題なく使っています :) )