2017年9月2日下午1点编辑
经过多次尝试后,我最终成功地用 pyinstaller 构建了一个 .exe。
不幸的是,我未能处理“theano”模块(在我的情况下是“pymc3”模块所需的),我不得不修改 .py 文件并放弃部分应用程序。我下面的描述有两个目的:首先它可能有帮助;第二任何人都可以帮助我使用“theano”模块构建适用于 Windows 7+ 的 .exe 吗?
提醒:我的 python 3 脚本在“.ui”文件中打开一个用 Qt Designer 制作的简单 GUI,并导入 pyqtgraph(使用 pyqt5)、pymc3(以及 pymc3 所需的 theano)、scipy、numpy、os、sys。它将在运行 Windows 7+ 的计算机上分发。我尝试用 py2exe、cx_freeze、pynsist 和 pyinstaller 构建一个“.exe”(我打开并更新了几篇文章,这个仍然是打开的:从导入 pyqtgraph 并打开 GUI 的 python 3 脚本构建适用于 Windows 的 .exe https://stackoverflow.com/questions/45734926/build-a-exe-for-windows-from-a-python-3-script-importing-pyqtgraph-and-opening)但都失败了。在我不得不放弃 theano 后,我的最佳结果(使用 pyinstaller)如下所述。
- 我最终得到的命令行是:
pyinstaller —noupx —onefile —add-data “toto.ui;.” toto.py
。但奇怪的是:
1 不包含 qt 设计器文件“toto.ui”,必须与 .exe 一起分发。否则,运行 .exe 时会出现错误消息,提示找不到 toto.ui;
2 python环境的“Library/plugin”目录中的“platforms”目录也必须与.exe一起分发。否则,运行 .exe 时会出现错误消息“此应用程序无法启动,因为找不到 qt”
平台插件 windows’(但构建时 pyinstaller 没有错误消息!)
3.exe有220MB大!似乎 pyinstaller 在构建过程中包含了一堆无用的东西。
乍一看,模块“pyqtgraph”似乎与 pyinstaller 不兼容。事实上,当python代码导入pyqtgraph时,pyinstaller给出了一个SyntaxError:‘yield’ inside async function
。在我看来,这似乎很尴尬(这是 pyinstaller 中的错误吗?)因为我从论坛上得到的印象是,这与仅与 python 3.6 兼容的异步生成器有关,而 pyinstaller 仅适用于与异步不兼容的 python 3.5生成器...那么为什么 pyinstaller 使用这个呢?事实证明,这个类似 bug 的功能在未发布的新版本 pyinstaller 中被禁用(因此默认情况下未安装):pip install git+https://github.com/pyinstaller/pyinstaller
,感谢 9dogs(在评论中)。我还发现在 py 文件中导入 pyqtgraph 之前显式写入 os.environ['PYQTGRAPH_QT_LIB'] = 'PyQt5' 或 'PyQt4' 可能会有所帮助
事实证明,theano 进行了几个 pyinstaller 未检测到的隐式导入。因此,构建看起来不错,但在运行 .exe 时,您会收到诸如“no module theano.tensor.shared_randomstreams”之类的错误消息。不幸的是,我未能使用 pyinstaller 的 '--hidden-import' 选项,因此我在 py 文件中显式添加了导入(在本例中为 'import theano.tensor.shared_randomstreams' )。
但这还不是结束:之后,文件‘…\AppData\Local\Temp_MEI35682\theano\gpuarray\blockgemv.c’丢失,导致[4128] Failed to execute script
。我不知道这个文件是什么,也没有找到信息。我放弃并删除了部分 GUI 以避免 theano。任何人都可以帮助我使用 theano 和 pyinstaller 吗?