web-dev-qa-db-ja.com

Python ctypes:loading DLL相対パスから

Python module、wrapper.py、C DLLをラップします。 DLLはモジュールと同じフォルダにあります。したがって、次のコードを使用してロードします。

myDll = ctypes.CDLL("MyCDLL.dll")

これは、wrapper.py独自のフォルダから。ただし、他の場所から実行すると失敗します。これは、ctypesが現在の作業ディレクトリからの相対パスを計算するためです。

私の質問は、現在の作業ディレクトリではなく、ラッパーに対する相対パスのDLLのパスを指定する方法はありますか?これにより、2つを一緒に出荷して、ユーザーがどこからでもラッパーを実行/インポートできるようになります。

25

os.path.dirname(__file__)を使用して、Pythonソースファイルが配置されているディレクトリを取得できます。

25

マシューの答えを拡張する:

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からは機能しません。

13
fmark

私は常に、自分の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 の詳細な手順)

10
Chris B.

別のバージョン:

dll_file = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'MyCDLL.dll')
myDll = ctypes.CDLL(dll_file)
0
Shtefan