Russian Qt Forum

Программирование => Python => Тема начата: kolob от Октябрь 01, 2013, 16:41



Название: [PythonQt] Проблема с загрузкой собственных модулей
Отправлено: kolob от Октябрь 01, 2013, 16:41
Всем привет.
Нуждаюсь в помощи. Использую PythonQt для решения одной задачи в программе. Чтобы ее решить своих модулей недостаточно и необходимо подключить сторонние. Поэтому пытаюсь их загрузить так:
Цитировать
PythonQt::init();
PythonQtObjectPtr mainModul = PythonQt::self()->getMainModule();
PythonQtImporter self;
PyObject *modul = PythonQtImport::getModuleCode(&self, "module", pathModule);
На что мне компилятор выдает:
Цитировать
ошибка: undefined reference to `PythonQtImport::getModuleCode(_PythonQtImporter*, char const*, QString&)'
Понятно дело не линкуется, но почему. Либы в проекте подключены:
Цитировать
win32:CONFIG(release, debug|release): LIBS += -LC:/PythonQt2.1_Qt4.8/lib/ -lPythonQt -lPythonQt_QtAll
else:win32:CONFIG(debug, debug|release): LIBS += -LC:/PythonQt2.1_Qt4.8/lib/ -lPythonQt_d -lPythonQt_QtAll_d

include(C:/PythonQt2.1_Qt4.8/build/common.prf)
include(C:/PythonQt2.1_Qt4.8/build/PythonQt.prf)
include(C:/PythonQt2.1_Qt4.8/build/PythonQt_QtAll.prf)
Посмотрел как в примерах.

Собирал PythonQt как описано здесь (http://www.prog.org.ru/index.php?topic=17773.msg119707#msg119707)


Название: Re: [PythonQt] Проблема с загрузкой собственных модулей
Отправлено: sergek от Октябрь 02, 2013, 11:47
У меня тоже не линкуется. Попробуйте задать вопрос Флориану http://sourceforge.net/p/pythonqt/discussion/631393/ (http://sourceforge.net/p/pythonqt/discussion/631393/).

Можно импортировать модули, используя PythonQt::importModule(). Для скриптов, включенных в файл ресурсов, имя начинается с ":".
Еще можно просто выполнить скрипт:
Код:
      mainModule.evalScript(QString("sys.path.append('%1')\n").arg(QDir::currentPath()));
      mainModule.evalScript("import eyed3tagger\n");


Название: Re: [PythonQt] Проблема с загрузкой собственных модулей
Отправлено: kolob от Октябрь 21, 2013, 11:27
Еще вопрос.
Даже не знаю как его сформулировать.
Нужно использовать программу, которая вызывает py-скрипты на машине где не установлен интерпретатор Python? Вот как то так.


Название: Re: [PythonQt] Проблема с загрузкой собственных модулей
Отправлено: sergek от Октябрь 21, 2013, 16:41
Нужно использовать программу, которая вызывает py-скрипты на машине где не установлен интерпретатор Python?
Не нужно ;)


Название: Re: [PythonQt] Проблема с загрузкой собственных модуl
Отправлено: kolob от Октябрь 22, 2013, 04:16
Цитировать
Не нужно Подмигивающий

Как то не так написал. Понятное дело что в программе уже встроен интерпретатор. Это был не вопрос.
Я не знал как это сделать.
Ну вся запара была в пакетах, которые идут со стандартным Python (os, copy, abc и т.д.) Они были нужны для другого пакета, который работает с excel файлами.
Я решил эту проблему скопировав нужные пакеты, заархивировал и поместил в ресурсы, а там уже при исполнении программы распаковывал в директорию с исполняемой программой.


Название: Re: [PythonQt] Проблема с загрузкой собственных модуl
Отправлено: kai666_73 от Октябрь 22, 2013, 10:54
Цитировать
Не нужно Подмигивающий

Как то не так написал. Понятное дело что в программе уже встроен интерпретатор. Это был не вопрос.
Я не знал как это сделать.
Ну вся запара была в пакетах, которые идут со стандартным Python (os, copy, abc и т.д.) Они были нужны для другого пакета, который работает с excel файлами.
Я решил эту проблему скопировав нужные пакеты, заархивировал и поместил в ресурсы, а там уже при исполнении программы распаковывал в директорию с исполняемой программой.

Костыль, однако.
Предлагаю другое решение:
1. В папке с екзешником создаем директорию (к примеру) python
2. Копируем в нее из директории куда установлен Python папочки DLLs и Lib
3. В программе, сразу после инициализации PythonQt, добавляем следующий код:
Код:
    PythonQt::self()->addSysPath(QApplication::applicationDirPath() + "/python/DLLs");
    PythonQt::self()->addSysPath(QApplication::applicationDirPath() + "/python/Lib");


Название: Re: [PythonQt] Проблема с загрузкой собственных модуl
Отправлено: kolob от Октябрь 23, 2013, 16:53
Костыль, однако.
Предлагаю другое решение:
1. В папке с екзешником создаем директорию (к примеру) python
2. Копируем в нее из директории куда установлен Python папочки DLLs и Lib
3. В программе, сразу после инициализации PythonQt, добавляем следующий код:
Код:
    PythonQt::self()->addSysPath(QApplication::applicationDirPath() + "/python/DLLs");
    PythonQt::self()->addSysPath(QApplication::applicationDirPath() + "/python/Lib");
Все это, я почти так и сделал. А архив с py-пакетами в ресурсах и дальнейшее их распаковка более надежнее.
А если какой либо нерадивый пользователь, удалит какой либо файл в этой директории или всю директорию.
А у меня при запуске проверялась эта папка на целостность и в случае чего заново извлекал в директорию все необходимые пакеты.


Название: Re: [PythonQt] Проблема с загрузкой собственных модулей
Отправлено: kai666_73 от Октябрь 24, 2013, 10:37
Ну да, наверно. По мне дак, - сие (защита от нерадивого пользователя) забота инсталлятора, а не установленной программы...
То бишь сломал что-то вредный пользователь, пускай переустанавливает.


Название: Re: [PythonQt] Проблема с загрузкой собственных модулей
Отправлено: kolob от Октябрь 24, 2013, 13:05
Цитировать
То бишь сломал что-то вредный пользователь, пускай переустанавливает.
Согласен.
Но мне приходится распространять прогу в папке со всеми имеющимися dll. Поэтому так более удобнее.


Название: Re: [PythonQt] Проблема с загрузкой собственных модулей
Отправлено: kai666_73 от Октябрь 24, 2013, 13:39
Но мне приходится распространять прогу в папке со всеми имеющимися dll. Поэтому так более удобнее.

Так это же и есть полу-авто-копи-инсталлятор. Что мешает вложить в распространяемую папку директории со стандартными ПЫ-скриптами/либами ???