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 问题。

在我的脚本的第 3 行添加import matplotlib或添加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'

import pandas第 3 行,我得到了相同的警告(以及关于 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 版本。使用默认的 --onedir 而不是 --onefile 时,所有三种方案都可以正常工作。谁能帮我弄清楚使用 --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 回答