gpt4 book ai didi

python - 使用 pyInstaller/UPX 制作的可执行文件遇到 QtCore4.dll 错误

转载 作者:太空狗 更新时间:2023-10-29 17:08:50 28 4
gpt4 key购买 nike

我用 pyInstaller 编译的 python 程序,结果超过 400 MB。该程序的 GUI 基于 htmlPY ,它是“PySide 的 QtWebKit 库的包装器”。该程序体积庞大,部分原因是它使用了 numpy、scipy 和 nltk,部分原因是图形库。

为了最小化程序的大小,我安装了UPX .这将程序的大小减小到略高于 100MB,虽然很大,但可以接受。

第一个问题是 pyInstaller 没有检测到 htmlPy,也没有将它包含在编译的程序中。这可以通过将 htmlPy 模块从我的 Python 安装复制到 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

关于这里发生了什么以及如何解决它有什么想法吗?

编辑:

这些是我的 .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:

这是一些初始化代码(standard htmlPy fare):

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 步之前崩溃。

最佳答案

您的两大担忧与:

  1. 正确性 - 带有 UPX 的应用程序不会运行
  2. 性能 - 400 MiB“太大”,而 100 MiB 可满足更多用户的需求

如果应用程序较小,它可能对更多人更有用,但如果它不能运行,它对没有人有用。您怀疑 UPX 改善了问题 2,但它的相互作用影响了问题 1。

构建一个简单的 HelloWorld 应用程序,用 pyInstaller + UPX 打包,并用额外的依赖项(如 Qt)不断美化它,直到你看到它像当前的破损一样破损,这会很有趣。

放弃 UPX 而采用其他方法可能会更有成效,包括 NSIS .您可能会使用 strace() 之类的工具来监控在系统测试运行期间实际 使用了哪些分布式文件,并在打包期间删除未使用的文件。通过 FUSE 代理请求会产生类似的信息。如果“已用安装时间”确实促使您希望将 400 MiB 缩小到 100 MiB,您可能会列出已发布应用程序的依赖项,并依赖 pip 或 conda 并行下载依赖项。

关于python - 使用 pyInstaller/UPX 制作的可执行文件遇到 QtCore4.dll 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39647658/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com