Форум сайта python.su
Здравствуйте, уважаемые питонеры!
Есть у меня задача - собрать из Python-программы исполняемый файл для Windows. Решил для этих целей использовать PyInstaller.
PyInstaller простые скрипты собирает отлично. Собирает без проблем даже более сложные программы, в которых используется PyQt4/PySide, Numpy, Matplotlib и т.д. Но у меня случился затык. Не работают программы, которые импортируют модули через функцию __import__. Пытаюсь ставить “hooks” так как понял из скудной документации - не помогает.
Опишу структуру тестового проекта:
project_dir/
+--pkg/
| +--test_module.py
| +--__init__.py
|
+--test.py
pkg = __import__('pkg.test_module')
module = getattr(pkg, 'test_module')
print module.message
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
# -*- 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'))
Офлайн
Немного изменил 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,
...
Отредактировано (Окт. 18, 2011 09:01:56)
Офлайн
Снимаю вопрос с повестки дня. Плюнул на этот долбанутый PyInstaller, cx_Freeze всё отлично собирает x86, x86-64 и всё работает без всяких проблем и кривых костылей.
Резюме:
Если у вас не работает программы, использующие __import__, собирайте их с помощью cx_Freeze. Смотрите примеры в папке \Lib\site-packages\cx_Freeze\samples\advanced. Там всё просто и понятно.
Всем спасибо за внимание! :)
Офлайн