Уведомления

Группа в Telegram: @pythonsu

#1 Май 14, 2012 16:28:47

belyal
От:
Зарегистрирован: 2010-08-26
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Загрузка dll из модуля в пакете

Доброго времени суток.
Не получается грамотно реализовать загрузку библиотеки 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.

Как грамотно решить эту проблему?



Отредактировано belyal (Май 14, 2012 16:30:16)

Офлайн

#2 Май 14, 2012 17:15:48

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Загрузка dll из модуля в пакете

У модуля есть

__file__



Отредактировано Андрей Светлов (Май 14, 2012 17:17:31)

Офлайн

#3 Май 15, 2012 10:11:43

belyal
От:
Зарегистрирован: 2010-08-26
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Загрузка dll из модуля в пакете

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



Офлайн

#4 Май 15, 2012 16:36:28

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Загрузка dll из модуля в пакете

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



Офлайн

#5 Май 16, 2012 10:56:51

belyal
От:
Зарегистрирован: 2010-08-26
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Загрузка dll из модуля в пакете

Переделал на __file__, но сути это не поменяло.



Офлайн

#6 Май 16, 2012 15:33:34

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Загрузка dll из модуля в пакете

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

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)



Офлайн

#7 Май 18, 2012 11:57:11

belyal
От:
Зарегистрирован: 2010-08-26
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Загрузка dll из модуля в пакете

Спасибо.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version