Найти - Пользователи
Полная версия: PyInstaller и Hidden imports
Начало » Инструментальные средства разработки » PyInstaller и Hidden imports
1
iroln
Здравствуйте, уважаемые питонеры!

Есть у меня задача - собрать из Python-программы исполняемый файл для Windows. Решил для этих целей использовать PyInstaller.
PyInstaller простые скрипты собирает отлично. Собирает без проблем даже более сложные программы, в которых используется PyQt4/PySide, Numpy, Matplotlib и т.д. Но у меня случился затык. Не работают программы, которые импортируют модули через функцию __import__. Пытаюсь ставить “hooks” так как понял из скудной документации - не помогает.

Опишу структуру тестового проекта:

project_dir/
+--pkg/
| +--test_module.py
| +--__init__.py
|
+--test.py
Есть тестовый скрипт и пакет с одним модулем.

Вот исходник файла test.py (этот файл я делаю исполняемым):
pkg = __import__('pkg.test_module')
module = getattr(pkg, 'test_module')

print module.message
В нём я импортирую пакет pkg, получаю из него модуль test_module. Мне нужно импортировать модуль из пакета, используя функцию __import__ (это необходимо делать именно так).
В собранном “экзешнике” на этапе импорта вываливается ошибка:

Traceback (most recent call last):
File "<string>", line 2, in <module>
File "C:\Programs\PyInstaller\iu.py", line 455, in importHook
raise ImportError, "No module named %s" % fqname
ImportError: No module named pkg
Вот такой сейчас Spec файл:
# -*- mode: python -*-

a = Analysis([os.path.join(HOMEPATH,'support\\_mountzlib.py'), os.path.join(HOMEPATH,'support\\useUnicode.py'),
os.path.join(SPECPATH, 'test.py')],
pathex=['C:\\Programs\\PyInstaller'])

pyz = PYZ(a.pure)

exe = EXE(pyz,
a.scripts,
exclude_binaries=1,
name=os.path.join('build\\pyi.win32\\test', 'test.exe'),
debug=False,
strip=False,
upx=True,
console=True,
icon=None)

coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
name=os.path.join(SPECPATH, 'Build', 'x86'))
Товарищи, подскажите, как правильно эти хуки настроить, какие файлы создать в PyInstaller/hooks/ чтобы разруливать неявный импорт?
iroln
Немного изменил SPEC файл. Теперь “мусора” хоть меньше в папке со сборкой.
# -*- mode: python -*-

a = Analysis([os.path.join(SPECPATH, 'test.py')])

pyz = PYZ(a.pure)

exe = EXE(pyz,
a.scripts,
exclude_binaries=1,
name=os.path.join('build\\pyi.win32\\test', 'test.exe'),
debug=False,
strip=False,
upx=True,
console=True,
icon=None)

coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
name=os.path.join(SPECPATH, 'Build', 'x86'))
Но по прежнему работать не хочет, ошибка кстати тоже изменилась:
Traceback (most recent call last):
File "<string>", line 2, in <module>
ImportError: No module named pkg.test_module
Не находит пакет с модулем. Пробую указывать модули явно, программа вообще падает на старте.

modules = [('test_module', os.path.join(SPECPATH, 'pkg\\test_module.py'), 'PYMODULE')]
exe = EXE(pyz,
a.scripts + modules,
...
Короче, я уже не знаю что делать. С этими хуками тоже ничего не понятно. Использовал бы какой-нибудь другой сборщик, но мне нужны бинарники как x86 так и x86-64, а это, похоже, умеет делать только PyInstaller.
iroln
Снимаю вопрос с повестки дня. Плюнул на этот долбанутый PyInstaller, cx_Freeze всё отлично собирает x86, x86-64 и всё работает без всяких проблем и кривых костылей.

Резюме:
Если у вас не работает программы, использующие __import__, собирайте их с помощью cx_Freeze. Смотрите примеры в папке \Lib\site-packages\cx_Freeze\samples\advanced. Там всё просто и понятно.

Всем спасибо за внимание! :)
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