Есть у меня задача - собрать из 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
В собранном “экзешнике” на этапе импорта вываливается ошибка:
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'))