LoginSignup
3
0

More than 1 year has passed since last update.

PATH通してるのにctypesで`FileNotFoundError: Could not find module (or one of its dependencies)`

Posted at

結果として、Windows版Python3.8でのctypes.LoadLibrary仕様変更、os.add_dll_directoryの追加の話です。
つまり、ライブラリのサーチで単純にPATHを参照しないということでした。

ハマったこと

Windows, Python 3.9で自前のmylib.dllを使いたい。
mylib.dlldep.dllに依存している。

mylib.dlldep.dllが同じディレクトリにある時は問題ない。

import ctypes
dll = ctypes.CDLL(R"path\to\mylib")

ところが、dep.dllを他のディレクトリに追いやってPATHを通したうえで同じことをすると

FileNotFoundError: Could not find module 'D:\XXXX\path\to\mylib' (or one of its dependencies). Try using the full path with constructor syntax.

などと言われる。

解決

os.add_dll_directoryを使って、dllのディレクトリ(サーチするパス)を明示的に与えてやれば解決した。

このissuesは正直いってよく分からなかったので、
今回は単純に環境変数PATHadd_dll_directoryに与えちゃうことにします。

import ctypes
import os

dll = ctypes.CDLL(R"path\to\mylib")
# FileNotFoundError: Could not find module 'D:\xxxx\path\to\mylib' (or one of its dependencies). Try using the full path with constructor syntax.

for p in os.environ['PATH'].split(os.pathsep):
    if os.path.isdir(p):
        os.add_dll_directory(p)
    
dll = ctypes.CDLL(R"mylib")
# 問題なし

これの問題は?

なんでこんな仕様になっているのかちゃんと調べていないが、PATHをそのまま使うのに何か危険があるのかもしれない。
解説か他の賢い方法があったら教えてください。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0