PyInstaller 使用时出现“No module named”错误

51

我试图在Windows 7上使用PyInstaller编译一个Python项目。这个项目本身运行得很好,没有问题,但是当我尝试编译它时,结果却不能正常工作。虽然在编译过程中我没有收到任何警告,但在build目录下的warnmain.txt文件中有很多警告:warnmain.txt

我实在不理解那些警告,例如“no module named numpy.pi”,因为numpy.pi不是模块而是一个数字。我从未尝试导入numpy.pi。我确实导入了numpymatplotlib。此外,我还使用了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”,没有任何负面声明。

我没有指定额外的挂钩目录,但是从编译输出中读取,钩子使用默认目录下的,例如,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是否将stdout重定向到其他地方,例如在崩溃时关闭的输出窗口)...进一步评论,我怀疑您遇到了崩溃(可能来自使用json / xml资源或其他东西(而不是import xxxx)的某些内容),并且错误消息被打印到某个QT窗口中,在崩溃时关闭...请查看qt.App是否具有redirect = False选项或其他选项以保持stdout。 - Joran Beasley
有趣的是,如果我执行 import numpy.sinh ,会出现 ImportError: No module named sinh 的错误提示,只有当我执行 import numpy.numpy.sinh 时才会出现 ImportError: No module named numpy.sinh 的错误提示。你是否查看过 PyInstaller finding out what went wrong 来获取错误信息、详细导入信息和调试信息? - ThatOneDude
2
@JoranBeasley:我刚试图在cmd中启动exe,但没有任何结果,但是为了编译,我使用了标志-w(请参见http://pythonhosted.org/PyInstaller/#options-for-the-executable-output),它可以防止Windows为任何输入/输出启动控制台。如果我不使用`-w`编译,则无法获得图形用户界面。但是,当从解释器调用程序时,程序可以正常工作,因此我认为这不是内部错误。 @ssnobody:我知道那个链接,但对我没有任何好处。import numpy.sinh不起作用,因为sinh不是模块。 - a_guest
@JoranBeasley:我必须更正一下,似乎可以在没有-w的情况下编译并获得GUI。但是如果我这样做,我会得到一个控制台,在那里我可以看到很短的时间(远远不足以实际阅读)有东西被写在那里,但然后应用程序终止。GUI没有出现。我尝试将此stdout以某种方式传输到文件中,以便我可以实际阅读它。 - a_guest
2
@JoranBeasley 谢谢你,你的建议正是正确的方法!实际上有一些库缺失(我通过导入它们来解决了这个问题,请参见我的编辑后的问题)。如果你不打算发布答案,我会简要总结一下。谢谢! - a_guest
15个回答

0
如果这些解决方案不起作用,只需删除并重新安装pyinstaller即可解决此问题(就像我现在所做的那样)。
将此放在这里,以供可能遇到此问题的其他人参考。

0
我曾经遇到过与PySimpleGUI类似的问题。 问题在于,pyinstaller安装在不同的目录中。 解决方案(对我有效):只需将pyinstaller安装在与要转换为exe的文件相同的目录中即可。

0

这可能不是一个好的做法,但在我的项目中使用的原始环境中安装pyinstaller(而不是单独的虚拟环境)有助于解决ModuleNotFoundError问题。


0
我遇到了同样的错误。我的错误信息是“ModuleNotFoundError: No module named 'numpy'”。我通过在命令提示符中输入以下内容来解决它:

pip install pyinstaller numpy


0
我的具体问题是,我的Python安装被分散在本地目录(%APPDATA%/python)和所有用户的目录(C:/program files/python)中。我只是删除了本地文件夹,重新安装了Python + pyinstaller,并确保它们位于所有用户的目录中,然后问题就解决了。

根据目前的写法,你的回答不够清晰。请编辑以添加更多细节,帮助其他人理解这如何回答所提出的问题。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接