15

pyInstallerでコンパイルした python プログラムは、400 MB を超えることが判明しました。プログラムの GUI は、「PySide の QtWebKit ライブラリのラッパー」であるhtmlPYに基づいています。プログラムのサイズが大きいのは、一部には 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:

初期化コードの一部を次に示します (標準の 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 に進む前に、プログラムがクラッシュします。

4

1 に答える 1