У меня есть модуль Python, wrapper.py
, это переносит DLL C. DLL находится в той же папке как модуль. Поэтому я использую следующий код для загрузки его:
myDll = ctypes.CDLL("MyCDLL.dll")
Это работает, если я выполняюсь wrapper.py
от его собственной папки. Если, однако, я выполняю его откуда-либо, это перестало работать. Поэтому ctypes вычисляет путь относительно текущего рабочего каталога.
Мой вопрос, там путь, которым я могу указать путь DLL относительно обертки вместо текущего рабочего каталога? Это позволит мне поставить два вместе и позволить пользователю выполнять/импортировать обертку отовсюду.
Вы можете использовать os.path.dirname (__ file __)
, чтобы получить каталог, в котором находится исходный файл Python.
Я всегда добавляю в путь каталог, в котором находится моя 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)
Расширяя ответ Мэтью:
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
.