Python module、wrapper.py
、C DLLをラップします。 DLLはモジュールと同じフォルダにあります。したがって、次のコードを使用してロードします。
myDll = ctypes.CDLL("MyCDLL.dll")
これは、wrapper.py
独自のフォルダから。ただし、他の場所から実行すると失敗します。これは、ctypesが現在の作業ディレクトリからの相対パスを計算するためです。
私の質問は、現在の作業ディレクトリではなく、ラッパーに対する相対パスのDLLのパスを指定する方法はありますか?これにより、2つを一緒に出荷して、ユーザーがどこからでもラッパーを実行/インポートできるようになります。
os.path.dirname(__file__)
を使用して、Pythonソースファイルが配置されているディレクトリを取得できます。
マシューの答えを拡張する:
import os.path
dll_name = "MyCDLL.dll"
dllabspath = os.path.dirname(os.path.abspath(__file__)) + os.path.sep + dll_name
myDll = ctypes.CDLL(dllabspath)
これはスクリプトからのみ機能し、コンソールやpy2exe
からは機能しません。
私は常に、自分のDLLが存在するディレクトリをパスに追加します。これは機能します。
os.environ['PATH'] = os.path.dirname(__file__) + ';' + os.environ['PATH']
windll.LoadLibrary('mydll.dll')
Py2exeを使用する場合、これは機能しないことに注意してください(__file__
は設定されません)。その場合は、sys.executable
属性( http://www.py2exe.org/index.cgi/WhereAmI の詳細な手順)
別のバージョン:
dll_file = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'MyCDLL.dll')
myDll = ctypes.CDLL(dll_file)