我尝试使用PyInstaller在Windows 7下编译Python项目。该项目工作正常,没有问题,但是当我尝试编译它时,结果不起作用。虽然我在编译过程中没有收到任何警告,但warnmain.txt
目录中的build
文件中有很多警告: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”,而且没有一个是否定的陈述。
我没有指定一个额外的钩子目录,而是使用默认目录向下的钩子,只要我可以从编译输出中读取,例如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没有给出任何错误/警告,我无法弄清楚问题是否与库相关或是否还有其他问题需要考虑。
答案 0 :(得分:11)
与no module named FileDialog
有类似的问题。发现使用版本3.2,我可以使用
pyinstaller --hidden-import FileDialog ...
而不是修改我的主脚本。
答案 1 :(得分:9)
Pyinstaller没有看到二级导入。因此,如果您导入模块 A ,pyinstaller会看到这一点。但是不会看到在 A 中导入的任何其他模块。
您无需更改python脚本中的任何内容。您可以直接将缺少的导入添加到规范文件。 只需更改以下行:
new
到
hiddenimports=[],
答案 2 :(得分:6)
问题是matplotlib的一些运行时依赖性。所以在运行程序时编译很好,引发了一些错误。因为终端立即关闭了我没有意识到这一点。将stdout
和stderr
重定向到文件后,我发现错过了库Tkinter
和FileDialog
。在主要顶部添加两个import
解决了这个问题。
答案 3 :(得分:2)
我遇到了同样的问题,以下解决方案对我有效:
答案 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 ...
错误,并且您:
然后您的可执行文件可能会找不到相对导入。
可以通过以下方式解决此问题:
__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