Boa*_*Boa 15 python qt pyinstaller upx pyside
我用pyInstaller编译的python程序结果超过400 MB.该程序的GUI基于htmlPY,它是"PySide的QtWebKit库的包装器".该程序的大尺寸部分归功于它利用numpy,scipy和nltk,部分原因是图形库.
为了最小化程序的大小,我安装了UPX.这将程序的大小减小到略超过100MB,这很大,但可以接受.
第一个问题是pyInstaller没有检测到htmlPy,并且没有将它包含在已编译的程序中.这可以通过将我的Python安装中的htmlPy模块复制到pyInstaller创建的'dist'目录中来解决.这样做之后,没有UPX编译的程序版本运行正常.
将htmlPy添加到'dist'目录后,运行可执行文件会在创建GUI时崩溃程序.我不确定这是否是由于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
Run Code Online (Sandbox Code Playgroud)
关于这里发生了什么,以及如何解决它的想法?
编辑:
这些是我的.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')
Run Code Online (Sandbox Code Playgroud)
这些是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)
Run Code Online (Sandbox Code Playgroud)
编辑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"
...
Run Code Online (Sandbox Code Playgroud)
程序在进入第3步之前崩溃.
您的两大担忧涉及:
如果应用程序较小,则可能对更多人有用,但如果无法运行,则对任何人都没有用处。您怀疑 UPX 改善了问题 2,但其相互作用影响了问题 1。
构建一个简单的 HelloWorld 应用程序,用 pyInstaller + UPX 打包它,并继续用额外的依赖项(如 Qt)来修饰它,直到你看到它像当前的损坏一样损坏,这会很有趣。
放弃 UPX 转而采用其他方法(包括NSIS )可能会更有成效。您可以使用 strace() 等工具来监视系统测试运行期间实际使用的分布式文件,并在打包期间修剪未使用的文件。通过FUSE代理请求将产生类似的信息。如果“已用安装时间”确实是您希望将 400 MiB 缩小到 100 MiB 的原因,您可以列出已发布应用程序的依赖项,并依靠 pip 或 conda 并行下载依赖项。
| 归档时间: |
|
| 查看次数: |
1194 次 |
| 最近记录: |