Reputation: 129
I've been trying to create an exe file from my py files. There are multiple py files, however, 1 entry point file. My code takes input from html, csv, xml files and generate a word file as an output.
I'm using Python 3.9, tried using Pyinstaller 4.2, 5(dev). Both giving the same error. Conversion is successful if I try to convert a file without matplotlib in it. I've tried different versions of matplotlib also. Specifically, 4.3.1, 4.3.0rc1, 3.2.2. However, everytime I'm getting the same error.
assert mpl_data_dir, "Failed to determine matplotlib's data directory!"
AssertionError: Failed to determine matplotlib's data directory!
I've also tried to make changes to the hook files as well, according to similar problem faced by other people, however, still the same problem persists.
Upvotes: 12
Views: 13802
Reputation: 839
I ran into this when trying to create an bare executable after I uninstalled matplotlib and PyInstaller was trying to pack the non-existent module.
The pip uninstall didn't fully delete matplotlib's directory from site-packages, after deleting it manually (same for PyQt5), the exe was built as expected.
Upvotes: 0
Reputation: 1065
I tried changing the hook-matplotlib.py
file as others suggested, but it turns out the newest version of Pyinstaller already has those changes, so as long as your pyinstaller is updated, you should be fine in that aspect (check by running pip install pyinstaller --upgrade
)
However, I was still running into the 'Failed to determine matplotlib's data directory!' issue and was able to resolve it by:
pip uninstall pathlib
This is a weird one, but there's (unfortunately) two pathlib packages in the Python world: one built-in and a different one on PyPi. If you're using the PyPi one by chance, the get_data_path()
function in hook-matplotlib.py
fails to work as expected and will cause that assertion to fail
--hidden-import matplotlib
Not sure if this one is 100% necessary, but I included it in my pyinstaller command to make sure the matplotlib hook file was being used (Ex: pyinstaller --onefile --windowed --hidden-import "matplotlib" ...
Hope this is helpful, this resolution was really frustrating to figure out
Upvotes: 2
Reputation: 2731
Thanks to wedesoft:
pip uninstall pathlib
did the job. I replaced pathlib
code with os.path
; everything works perfect.
NOTICE: Updating matplotlib
or pyinstaller
didn't help me. I'm sure it'll be fixed in the newer pyinstaller version. More about the same issue here:
https://github.com/pyinstaller/pyinstaller/issues/5004
Upvotes: 8
Reputation: 2989
The error in my case (Python 3.8, PyInstaller 4.3, matplotlib 3.3.3) was this:
........
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!"
I had a dependency on pathlib
which broke the PyInstaller hook for matplotlib. After removing pathlib
from setup.py/requirements.txt and uninstalling pathlib
it worked (pathlib
is part of Python 3.8, so no need to install the old module).
Upvotes: 0
Reputation: 41
It's an error caused by the pyinstaller matplotlib hook, for some reason the exec_statement() function that is supposed to be getting the data path is not working. This is what worked for me:
If you followed correctly, your code should look like this:
import matplotlib
mpl_data_dir = matplotlib.get_data_path()
datas = [
(mpl_data_dir, "matplotlib/mpl-data"),
]
Upvotes: 4
Reputation: 1
You can stick to the current matplotlib version but have to update pyinstaller (5.0.dev0):
pip install -U https://github.com/pyinstaller/pyinstaller/archive/develop.zip
Upvotes: 0
Reputation: 1410
I don't understand why, but the issue was solved when we installed matplotlib==3.0.2 and pyinstaller==4.2
Upvotes: 2