使用PyInstaller时没有命名的模块

a_g*_*est 25 python numpy matplotlib pyinstaller pyqt4

我尝试使用PyInstaller在Windows 7下编译Python项目.该项目工作正常,没有问题,但是当我尝试编译它时,结果不起作用.虽然在编译期间我没有收到任何警告warnmain.txt,但build目录中的文件中有许多警告:warnmain.txt

我真的不明白那些警告,例如"没有名为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_())
Run Code Online (Sandbox Code Playgroud)

这里成功意味着创建的可执行文件实际上显示了所需的输出.但是,还会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
Run Code Online (Sandbox Code Playgroud)

由于PyInstaller没有给出任何错误/警告,我无法弄清楚问题是否与库有关或是否还有其他问题需要考虑.

101*_*101 21

如果您遇到ModuleNotFoundError: No module named ...错误并且您:

  • 从主脚本目录以外的目录调用 PyInstaller
  • 在脚本中使用相对导入

那么您的可执行文件可能无法找到相对导入。

这可以通过以下方式解决:

  • 从与主脚本相同的目录调用 PyInstaller

  • 或者删除任何__init__.py文件(__init__.pyPython 3.3+ 中不需要空文件)

  • 或者使用 PyInstaller 的paths标志来指定搜索导入的路径。例如,如果您从父文件夹调用 PyInstaller 到主脚本,并且您的脚本位于 中subfolder,则按如下方式调用 PyInstaller:

    pyinstaller --paths=subfolder subfolder/script.py

  • 嘿,感谢您的回答,尤其是“--paths”部分。谢谢 (4认同)

HHe*_*est 15

有类似的问题no module named FileDialog.发现版本3.2,我可以使用

pyinstaller --hidden-import FileDialog ...

而不是修改我的主脚本.


use*_*007 11

Pyinstaller不会看到二级导入.因此,如果您导入模块A,pyinstaller会看到这一点.但是不会看到在A中导入的任何其他模块.

您无需更改python脚本中的任何内容.您可以直接将缺少的导入添加到spec文件中.只需更改以下行:

hiddenimports=[],
Run Code Online (Sandbox Code Playgroud)

hiddenimports=["Tkinter", "FileDialog"],
Run Code Online (Sandbox Code Playgroud)


a_g*_*est 7

问题是matplotlib的一些运行时依赖性.所以在运行程序时编译很好,引发了一些错误.因为终端立即关闭了我没有意识到这一点.重定向后stdout,并stderr到一个文件,我可以看到,我错过了图书馆TkinterFileDialog.import在主要顶部添加两个s解决了这个问题.


HBK*_*396 6

我面临着同样的问题,以下解决方案对我有用:

  1. 我首先删除了我工作的虚拟环境。
  2. 使用pip重新安装了所有模块(注意:这次我没有创建任何虚拟环境)。
  3. 然后我调用了pyinstaller
  4. 此后创建的.exe文件执行顺利,没有任何模块导入错误。