Python ctypes: загрузка DLL из относительного пути - PullRequest
24 голосов
/ 05 июня 2010

У меня есть модуль Python, wrapper.py, который оборачивает C DLL. DLL находится в той же папке, что и модуль. Поэтому я использую следующий код для его загрузки:

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

Это работает, если я выполняю wrapper.py из своей собственной папки. Если, однако, я запускаю его из другого места, это не удается. Это потому, что ctypes вычисляет путь относительно текущего рабочего каталога.

У меня вопрос, есть ли способ, которым я могу указать путь к DLL относительно оболочки вместо текущего рабочего каталога? Это позволит мне отправить их вместе и позволить пользователю запускать / импортировать упаковщик из любого места.

Ответы [ 3 ]

24 голосов
/ 05 июня 2010

Вы можете использовать os.path.dirname(__file__), чтобы получить каталог, в котором находится исходный файл Python.

12 голосов
/ 05 июня 2010

Расширяя ответ Матфея:

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.

8 голосов
/ 05 июня 2010

Я всегда добавляю каталог, где моя 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)

...