Python ctypes: загружаемая DLL от от относительного пути

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

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

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

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

24
задан Frederick The Fool 5 June 2010 в 13:25
поделиться

3 ответа

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

25
ответ дан 28 November 2019 в 23:20
поделиться

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

9
ответ дан 28 November 2019 в 23:20
поделиться

Расширяя ответ Мэтью:

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
ответ дан 28 November 2019 в 23:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: