使用Pyinstaller从.py文件创建.exe时出现Matplotlib目录未找到的问题。

12

我一直在尝试从我的py文件中创建exe文件。有多个py文件,但是只有1个入口点文件。我的代码从html、csv、xml文件中获取输入,并生成一个word文件作为输出。

我正在使用Python 3.9,尝试使用Pyinstaller 4.2和5(dev),但两者都会出现相同的错误。如果我尝试转换没有matplotlib的文件,则转换成功。我已经尝试了不同版本的matplotlib,包括4.3.1、4.3.0rc1、3.2.2。然而,每次我都得到相同的错误。

assert mpl_data_dir, "Failed to determine matplotlib's data directory!"

AssertionError: Failed to determine matplotlib's data directory!

我也尝试根据其他人遇到的类似问题修改hook文件,但仍然存在相同的问题。


pyinstaller 创建 exe 文件有些棘手,很多时候需要打包。你能分享一下最小的代码来重现你的错误吗?然后我们可以尝试给你建议。 - simpleApp
我建议使用Anaconda发行版,这很可能会让你的生活变得更加容易。软件包列表 - Trenton McKinney
7个回答

8

感谢wedesoft:

pip uninstall pathlib

工作完成了,我用os.path替换了pathlib的代码;一切都运行得很完美。

注意:更新 matplotlib 或者 pyinstaller 没有帮助到我解决问题。我相信这个问题会在新版本的 pyinstaller 中被修复。关于同样的问题信息请见:

https://github.com/pyinstaller/pyinstaller/issues/5004


这个解决了我的问题。我正在运行Python 3.8.10和Matplotlib 3.4.2。 - Paul Ngo
谢谢,我遇到了同样的问题并尝试了很多方法,现在找到这个解决方案,它就可以工作了 ^^ - Taki7o7
到了2023年仍然存在这个问题,卸载pathlib后问题得以解决。 - BeardedOne85

4

这是由pyinstaller matplotlib挂钩引起的错误,由于某种原因,应该获取数据路径的exec_statement()函数不起作用。以下是解决方案:

  1. 进入安装pyinstaller的文件夹。
  2. 进入hooks文件夹。
  3. 找到并打开hook-matplotlib.py文件。
  4. 删除PyInstaller导入,然后导入matplotlib。
  5. 将exec_statement()函数更改为matplotlib.get_data_path()函数,可以删除assert。

如果你按照正确的步骤进行,你的代码应该如下所示:

import matplotlib

mpl_data_dir = matplotlib.get_data_path()
datas = [ 
    (mpl_data_dir, "matplotlib/mpl-data"), 
]

1
请勿添加代码图像。您可以将代码作为文本添加。请参阅如何使用Markdown或HTML格式化帖子? - nobleknight
我不知道可视化编辑器,谢谢! - Lucas Vinícius
我无法在我的系统中找到pyinstaller所在的hooks文件夹。 - hbstha123
这对我来说是最简单的解决方案,你是个天才卢卡斯!为此,我使用ANACONDA NAVIGATOR创建了一个全新的conda环境,而不是Anaconda Prompt。然后我安装了我的Python程序所需的每个库和pyinstaller。然后查找包含pyinstaller库的文件夹,对于我来说是C:\Users\MyWindows10\anaconda3\envs\ExeBirth\Lib\site-packages\PyInstaller(ExeBirth只是我的conda env的名称),然后像卢卡斯说的那样编辑hook-matplotlib.py文件,问题解决了。 - RedEye

2
我尝试按照别人建议更改了hook-matplotlib.py文件,但最新版本的Pyinstaller已经包含了这些更改,所以只要你的pyinstaller已经更新,那么在这方面你就没有问题(通过运行pip install pyinstaller --upgrade进行检查)。
然而,我仍然遇到了“未能确定matplotlib数据目录!”的问题,并且通过以下方法解决:
1. 运行pip uninstall pathlib 这是一个奇怪的问题,在Python世界中有两个pathlib包:一个内置的和一个在PyPi上的不同包。如果你碰巧使用的是PyPi上的那个包,则hook-matplotlib.py中的get_data_path()函数无法正常工作,并会导致断言失败。
2. 在Pyinstaller命令中包括--hidden-import matplotlib 不确定这一步是否100%必要,但我在我的pyinstaller命令中包括了它,以确保使用了matplotlib hook文件(例如:pyinstaller --onefile --windowed --hidden-import "matplotlib" ...
希望这对你有帮助,这个问题真的很让人沮丧。

1
我必须说我很幸运能够遇到你上面的建议。省了我大量的时间和挫折!谢谢。 - fishbacp
由于我正在使用Anaconda,这个解决方案仍然可行吗? - Bakira

2

我不明白为什么,但当我们安装了matplotlib==3.0.2和pyinstaller==4.2时,问题就解决了。


1
那么如果有人需要包含它呢? - Mohith7548
matplotlib 删除了数据目录的默认变量,因此找不到该目录。 但是,在 matplotlib v3.2.2 之后才删除它,因此降级到任何低于该版本的版本都可以解决这个问题并解决您的问题。 - mmarion

0
在尝试创建一个裸的可执行文件时,我遇到了这个问题。在卸载了 matplotlib 后,PyInstaller 试图打包不存在的模块。 pip 卸载未完全删除 matplotlib 的 site-packages 目录,在手动删除它之后(对 PyQt5 也是如此),可执行文件成功构建。

0

在我的情况下(Python 3.8,PyInstaller 4.3,matplotlib 3.3.3),错误是这样的:

 ........
 File "c:\users\dev\appdata\local\programs\python\python38\lib\ntpath.py", line 293, in expanduser
    path = os.fspath(path)
TypeError: expected str, bytes or os.PathLike object, not WindowsPath
Traceback (most recent call last):
    ........
    assert mpl_data_dir, "Failed to determine matplotlib's data directory!"

我在使用pathlib时,它破坏了matplotlib的PyInstaller钩子。在从setup.py/requirements.txt中删除pathlib并卸载pathlib后,它就可以正常工作了(pathlib是Python 3.8的一部分,因此不需要安装旧模块)。


0

这对我来说似乎克服了这个错误。 - hbstha123

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