【发布时间】:2014-11-02 05:11:30
【问题描述】:
我尝试使用 PyInstaller 在 Windows 7 下编译 Python 项目。该项目工作正常,没有问题,但是当我尝试编译它时,结果不起作用。虽然我在编译期间没有收到任何警告,但 build 目录中的 warnmain.txt 文件中有很多警告:warnmain.txt
我不太了解这些警告,例如“没有名为 numpy.pi 的模块”,因为 numpy.pi 不是模块而是一个数字。我从未尝试导入numpy.pi。我确实明确地导入了numpy 和matplotlib。另外我正在使用 PyQt4。我认为该错误可能与这些库有关。
但是我能够编译一个成功使用 numpy 的简单脚本:
import sys
from PyQt4 import QtGui, QtCore
import numpy as np
class MainWindow(QtGui.QMainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)
self.pb = QtGui.QPushButton(str(np.pi), self)
app = QtGui.QApplication(sys.argv)
main = MainWindow()
main.show()
sys.exit(app.exec_())
这里的成功意味着创建的可执行文件实际上显示了所需的输出。然而,还创建了一个warnmain.txt 文件,其中包含与之前完全相同的“警告”。所以我猜想编译我的实际项目并没有取得任何成功的事实与这些警告无关(或至少不仅)。但是还有什么可能是错误呢?编译期间的唯一输出是 'INFO's,并且没有一个是否定语句。
我没有指定一个额外的钩子目录,但我可以从编译输出中读取到使用默认目录的钩子,例如hook-matplotlib 已被执行。我看不到numpy 的任何钩子,我的小示例脚本也看不到,但这个有效。我在我的文件中使用了以下导入(并非全部在相同的文件中,而是在不同的文件中):
import numpy as np
import matplotlib.pyplot as ppl
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt4agg import NavigationToolbar2QTAgg as NavigationToolbar
from PyQt4 import QtGui, QtCore
import json
import sys
import numpy # added this one later
import matplotlib # added this one later
由于 PyInstaller 没有给出任何错误/警告,我无法确定问题是否与库有关,或者是否还有其他需要考虑的问题。
【问题讨论】:
-
当您尝试从命令行启动程序时是否收到错误消息?或者它只是不会启动并且没有打印任何内容(qt 是否将标准输出重定向到其他地方,例如崩溃时关闭的输出窗口?)...进一步我的评论我怀疑你有崩溃(可能来自使用 json 的东西/xml 资源或其他东西(不导入 xxxx)...并且错误消息正在打印到某个 QT 窗口,当您崩溃时该窗口最终会关闭...查看 qt.App 是否有 redirect=False 选项或其他东西来保持标准输出
-
有趣的是,如果我要执行类似
import numpy.sinh的操作,我会得到ImportError: No module named sinh并且只有当我执行import numpy.numpy.sinh时才会得到ImportError: No module named numpy.sinh。你检查过PyInstaller finding out what went wrong吗?获取错误/详细导入/调试信息? -
@JoranBeasley:我只是尝试从 cmd 启动 exe,但没有任何结果,但为了编译,我使用了标志
-w(请参阅 pythonhosted.org/PyInstaller/#options-for-the-executable-output),它阻止 Windows 启动任何控制台输入输出。如果我在没有-w的情况下进行编译,我将无法获得图形用户界面。但是,从解释器调用时程序运行良好,所以我不认为这是内部错误。 @ssnobody:我知道那个链接,但它没有给我带来任何好处。import numpy.sinh将无法工作,因为sinh不是模块。 -
@JoranBeasley:我必须纠正自己,似乎可以在没有
-w的情况下编译并获得 GUI。但是,如果我这样做,我会得到一个控制台,在那里我可以在很短的时间内看到(实际阅读时间很短)那里写了一些东西,但随后应用程序终止了。 GUI 不出现。我尝试以某种方式将此标准输出保存到文件中,以便我可以实际读取它。 -
@JoranBeasley 谢谢伙计,你的建议是正确的!实际上缺少一些库(我通过导入它们来修复它们,请参阅我编辑的问题)。如果您没有发布答案,我将简短地总结一下。谢谢!
标签: python numpy matplotlib pyqt4 pyinstaller