Подтвердить что ты не робот

Ptyon ctypes: загрузка DLL из относительного пути

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

Развернувшись на Матфея, ответьте:

import os.path
dll_name = "MyCDLL.dll"
dllabspath = os.path.dirname(os.path.abspath(__file__)) + os.path.sep + dll_name
myDll = ctypes.CDLL(dllabspath)

Это будет работать только с script, а не с консоли или с py2exe.

Ответ 3

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

Ответ 4

Другая версия:

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