使用PyInstaller时没有命名的模块

时间:2014-09-08 21:34:20

标签: python numpy matplotlib pyqt4 pyinstaller

我尝试使用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_())

这里成功意味着创建的可执行文件实际显示了所需的输出。但是,还会创建一个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没有给出任何错误/警告,我无法弄清楚问题是否与库相关或是否还有其他问题需要考虑。

8 个答案:

答案 0 :(得分:11)

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

pyinstaller --hidden-import FileDialog ...

而不是修改我的主脚本。

答案 1 :(得分:9)

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

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

new

hiddenimports=[],

答案 2 :(得分:6)

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

答案 3 :(得分:2)

我遇到了同样的问题,以下解决方案对我有效:

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

答案 4 :(得分:1)

如果问题是你不需要Tkinter和朋友,因为你正在使用PyQt4,那么最好避免完全加载Tkinter等。查看/ etc / matplotlibrc并将默认值更改为PyQt4,请参阅下面的“修改”行:

#### CONFIGURATION BEGINS HERE

# The default backend; one of GTK GTKAgg GTKCairo GTK3Agg GTK3Cairo
# CocoaAgg MacOSX Qt4Agg Qt5Agg TkAgg WX WXAgg Agg Cairo GDK PS PDF SVG
# Template.
# You can also deploy your own backend outside of matplotlib by
# referring to the module name (which must be in the PYTHONPATH) as
# 'module://my_backend'.

#modified 
#backend      : TkAgg
backend      : Qt4Agg


# If you are using the Qt4Agg backend, you can choose here
# to use the PyQt4 bindings or the newer PySide bindings to
# the underlying Qt4 toolkit.

#modified 
#backend.qt4 : PyQt4        # PyQt4 | PySide
backend.qt4 : PyQt4        # PyQt4 | PySide

答案 5 :(得分:0)

我在pyinstaller 3.0和weblib时遇到了同样的问题。在主要导入它没有帮助。

升级到3.1并删除所有构建文件有帮助。

pip install --upgrade pyinstaller

答案 6 :(得分:0)

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

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

然后您的可执行文件可能会找不到相对导入。

可以通过以下方式解决此问题:

  • 从与主脚本相同的目录中调用PyInstaller
  • 删除任何__init__.py文件(在Python 3.3+中不需要空__init__.pt文件)
  • 或使用PyInstaller的paths标志来指定path to search for imports。例如。如果您要从父文件夹调用PyInstaller到主脚本,而您的脚本位于subfolder中,则应这样调用PyInstaller:

    pyinstaller --paths=subfolder subfolder/script.py

答案 7 :(得分:0)

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