Найти - Пользователи
Полная версия: Загрузка dll из модуля в пакете
Начало » Python для новичков » Загрузка dll из модуля в пакете
1
belyal
Доброго времени суток.
Не получается грамотно реализовать загрузку библиотеки dll из модуля расположенного в пакете. Кто имел положительный опыт, прошу оказать помощь. Спасибо.

Структура проекта следующая:
main.py
mypackage/
      __init__.py
      mymodule.py
      mylib.dll

В файле mymodule.py реализован класс-обертка для библиотеки mylib.dll. Библиотека загружается через ctypes.CDLL. В этом же файле реализован self-test код. Если запускать этот self-test код, то программа работает должным образом.

В файле main.py импортируется модуль mymodule.py из пакета mypackage с целью применения вышеупомянутого класса. Но выполнение программы завершается с ошибкой ввиду того, что модуль ищется в корневом каталоге.
Traceback (most recent call last):
  File "D:\test\main.py", line 3, in <module>
    mymodule.test()
  File "D:\test\mypackage\mymodule.py", line 5, in test
    dll = CDLL('mylib.dll')
  File "C:\Python32\lib\ctypes\__init__.py", line 340, in __init__
    self._handle = _dlopen(self._name, mode)
WindowsError: [Error 126] Не найден указанный модуль
Модифицирование строчки
dll = CDLL('mylib.dll')
на
dll = CDLL(r'mypackage/mylib.dll')
не является приемлемым, т.к. в таком случае ломается self-test модуля mymodule.py.

Как грамотно решить эту проблему?
Андрей Светлов

У модуля есть

__file__
belyal
Андрей Светлов
У модуля есть
__file__
Я через __name__ сделал, но мне такое решение не нравится.
К тому же в другом проекте пришлось использовать os.chdir() т.к. библиотека которую я загружаю, сама пытается загрузить 2 другие библиотеки, которые лежат в той же папке что и первая.
Андрей Светлов

зачем вам __name__, если нужен полный путь к dll?

belyal
Переделал на __file__, но сути это не поменяло.
Андрей Светлов

Не понимаю ваших затруднений.

import ctypes
import os.path
import sys

here = os.path.dirname(__file__ if __file__ else sys.argv[0])
dllname = os.path.join(here, 'mylib.dll')
dll = ctypes.CDLL(dllname)
belyal
Спасибо.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB