1

--onefile フラグを指定して PyInstaller を使用すると、次のスクリプトを .exe に正常にビルドできます。

import sys
from PyQt4 import QtGui

class Example(QtGui.QMainWindow):
    def __init__(self):
        super(Example, self).__init__()
        self.initUI()

    def initUI(self):               
        self.statusBar().showMessage('Ready')
        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Statusbar')    
        self.show()

def main():
    app = QtGui.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

ビルド時に以下の警告が表示されます:(読みやすくするために、「PYINSTALLERDIR」を使用してフルパスを置き換えます。これは「C:\Users\name\Downloads\pyinstaller-pyinstaller-v2.0-544-g337ae69\pyinstaller-pyinstaller-」です337ae69\".

PYINSTALLERDIR>pyinstaller.py --onefile --log-level=WARN MainWindowHello.py
1306 WARNING: library python%s%s required via ctypes not found
1468 INFO: Adding Microsoft.VC90.CRT to dependent assemblies of final executable
2957 WARNING: library python%s%s required via ctypes not found

しかし、出力された 14 MB の .exe は正常に実行され、Qt ウィンドウが表示されます。ただし、pandas、matplotlib、または sklearn を追加しようとすると、Qt で問題が発生します。

import matplotlibまたはをスクリプトの 3 行目に追加するimport sklearnと、ビルド時に次の警告が表示されます。

PYINSTALLERDIR>python pyinstaller.py --onefile --log-level=WARN MainWindowHello.py
1371 WARNING: library python%s%s required via ctypes not found
1528 INFO: Adding Microsoft.VC90.CRT to dependent assemblies of final executable
3051 WARNING: library python%s%s required via ctypes not found
27108 INFO: Adding Microsoft.VC90.MFC to dependent assemblies of final executable
33329 INFO: Adding Microsoft.Windows.Common-Controls to dependent assemblies of final executable

結果の .exe (matplotlib の場合は 44 MB、sklearn の場合は 87 MB) を実行しようとすると、Qt ウィンドウが表示されず、次のエラー メッセージが表示されます。

WARNING: file already exists but should not: C:\Users\name\AppData\Local\Temp\_MEI75002\Include\pyconfig.h
Traceback (most recent call last):
  File "<string>", line 2 in <module>
  File "PYINSTALLERDIR\PyInstaller\loader\pyi_importers.py", line 409, in load_module
ImportError: could not import module 'PySide.QtCore'

3 行目でimport pandas、同じ警告が表示されます (libzmq.pyd に関する警告も同様ですが、動作中のプログラムで以前に表示されています)。119 MB の .exe を実行しようとすると、プログラムがクラッシュし、次のエラーがスローされます。

WARNING: file already exists but should not: C:\Users\name\AppData\Local\Temp\_MEI85162\include\pyconfig.h
Sub class of QObject not inheriting QObject!? Crash will happen when using Example.

PyInstaller 2.0 と dev バージョンの両方を試しました。--onefile の代わりにデフォルトの --onedir を使用すると、3 つのシナリオはすべてうまく機能します。--onefile を使用したときに何がうまくいかないかを理解するのを手伝ってくれる人はいますか?

更新: PyInstaller 2.1 で pandas を使用してビルドしようとしましたが、--onefile を使用すると同じエラーが発生します。繰り返しますが、--onefile を使用しない場合はすべて機能します。

4

1 に答える 1

1

PyQt4 をインポートしていたスクリプトと、PySide をインポートしていたいくつかのモジュールで同じ問題が発生していました。PyInstaller は--onedirオプション (デフォルト) で問題なく動作しましたが、オプションImportError: could not import module 'PySide.QtCore'を使用すると取得--onefileできました。

これを読んだ後'PySide'、スペックファイルに除外として追加して、PyQt4の排他的使用を強制しようとしましたが、exeは正常に実行されるようになりました。リストしたモジュールは PyQt4 で正常に動作するはずなので、問題も解決するはずです。

また、これは大きな問題ではありませんが、file already exists警告の解決策がここに記載されています。a = Analysis...警告の原因となる重複を削除するには、スペック ファイルに次の行を追加するだけです。

for d in a.datas:
    if 'pyconfig' in d[0]: 
        a.datas.remove(d)
        break
于 2014-03-28T22:40:51.360 に答える