Программа на Python, которую я скомпилировал с помощью pyInstaller, оказалась более 400 МБ. Графический интерфейс программы основан на htmlPY, который является "оболочкой библиотеки PySide QtWebKit". Большой размер программы частично обусловлен тем, что она использует numpy, scipy и nltk, а частично — графическими библиотеками.
Чтобы минимизировать размер программы, я установил UPX. Это уменьшило размер программы до чуть более 100 МБ, что является большим, но приемлемым.
Первая проблема заключается в том, что pyInstaller не обнаружил htmlPy и не включил его в скомпилированную программу. Это можно исправить, скопировав модуль htmlPy из моей установки Python в каталог «dist», созданный pyInstaller. После этого версия программы, скомпилированная без UPX, заработала нормально.
После добавления htmlPy в каталог «dist» запуск исполняемого файла приводит к сбою программы в момент создания графического интерфейса. Я не уверен, связано ли это с проблемным взаимодействием между UPX и QT или между UPX, QT и htmlPy. «Сигнатура проблемы» Windows выглядит следующим образом:
Problem signature:
Problem Event Name: APPCRASH
Application Name: main.exe
Application Version: 0.0.0.0
Application Timestamp: 00000000
Fault Module Name: QtCore4.dll
Fault Module Version: 4.8.7.0
Fault Module Timestamp: 561e435a
Exception Code: c0000005
Exception Offset: 000000000010883a
Любые идеи относительно того, что здесь происходит, и как это исправить?
ИЗМЕНИТЬ:
Это содержимое моего файла .spec:
# -*- mode: python -*-
block_cipher = None
added_files = [
( 'htmlPy/binder.js', 'htmlPy' ),
( 'templates/*', 'templates' ),
]
a = Analysis(['main.py'],
pathex=['C:\\..\\My_App'],
binaries=None,
datas=added_files,
hiddenimports=[],
hookspath=[],
runtime_hooks=['rthook_pyqt4.py'],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
exclude_binaries=True,
name='My_App',
debug=False,
strip=False,
upx=True,
console=True )
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
name='My_App')
Это содержимое rthook_pyqt4.py:
import sip
sip.setapi(u'QDate', 2)
sip.setapi(u'QDateTime', 2)
sip.setapi(u'QString', 2)
sip.setapi(u'QTextStream', 2)
sip.setapi(u'QTime', 2)
sip.setapi(u'QUrl', 2)
sip.setapi(u'QVariant', 2)
Редактировать 2:
Вот часть кода инициализации (стандартный тариф htmlPy):
app.static_path = path.join(BASE_DIR, "static/")
print "Step 1"
app.template_path = path.join(BASE_DIR, "templates/")
print "Step 2"
app.template = ("index.html", {"username": "htmlPy_user"})
print "Step 3"
...
Программа аварийно завершает работу, не дойдя до шага 3.
setoop.py
? Как добавить свой модуль в качестве импортного или дополнительного? - person dsgdfg   schedule 29.09.2016--hidden-import
вариант и посмотрите, есть ли еще проблема. - person Repiklis   schedule 30.09.2016--hidden-import
, и мне все еще нужно скопировать и вставить папку htmlPy и содержащийся в ней файлbinder.js
(файлы python в папке можно опустить) вручную в каталог исполняемой программы, потому что UPX пропускает это. Еще раз, после того, как я вручную скопировал / вставил в каталог htmlPy (на этот раз только содержащийbinder.js
) и запустил программу, она вылетает. Может ли проблема быть связана с тем, что UPX пропускает/не сжимает файлbinder.js
htmlPy? Есть ли способ заставить UPX включить эту папку в каталог распространения, который он генерирует? - person Boa   schedule 30.09.2016.spec
. Я боюсь, что в этом случае вам понадобится добавитьbinder.js
в качестве файл данных. Я добавлю подробный ответ ниже. - person Repiklis   schedule 02.10.2016('C:\\Python35-32\\Lib\\site-packages\\....\\Qt4Core.dll', '.')
- person sytech   schedule 13.10.2016added_files
, но они присутствуют (включая QT4Core.dll) в основной папке сгенерированной программы. - person Boa   schedule 13.10.2016rthook_pyqt4.py
выше - если я не ошибаюсь, разве предложениеruntime_hooks=['rthook_pyqt4.py']
в файле спецификаций не гарантирует, что включены правильные версии DLL QT? - person Boa   schedule 14.10.2016