我用pyInstaller编译了一个python程序,结果发现它超过了400MB。程序的GUI基于“Pyside的qtWebkit库的包装器”。程序的大尺寸部分归功于它使用了numpy、scipy和nltk,部分原因是图形库。
为了最小化程序的大小,我安装了htmlPY。这将程序的大小缩小到略大于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')

以下是本书的内容:
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:
以下是一些初始化代码(UPX):
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之前崩溃。

最佳答案

你的两个大问题涉及:
正确性-带UPX的应用程序无法运行
性能-400 mib“太大”,100 mib使您能够处理更大的一组用户
如果这个应用程序更小的话,可能对更多的人更有用,但是如果它不运行,对任何人都没用。您怀疑UPX改善了关注点2,但它的交互影响了关注点1。
构建一个简单的helloworld应用程序,用pyinstaller+upx打包它,并用额外的依赖项(如qt)不断地修饰它,直到你看到它以一种类似当前中断的方式中断。
放弃UPX而改用其他方法可能会更有成效,包括NSIS。您可以使用Strace()之类的工具来监视系统测试运行期间实际使用的分布式文件,并在打包期间删除未使用的文件。通过FUSE代理请求将产生类似的信息。您可能会列出已发布应用程序的依赖项,并依赖PIP或CONDA并行下载依赖项,如果“经过的安装时间”真的是驱动您将400减少到100 mib的原因。

09-17 02:44