--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 を使用しない場合はすべて機能します。