Compile with pyinstaller [duplicate]

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.


Solution 1:

I don't understand why, but the issue was solved when we installed matplotlib==3.0.2 and pyinstaller==4.2

Solution 2:

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:

  1. Go to the folder where pyinstaller is installed.
  2. Go to the hooks folder.
  3. Locate and open hook-matplotlib.py file.
  4. Delete the PyInstaller import and then import matplotlib.
  5. change the exec_statement() function to matplotlib.get_data_path() function, you can delete the assert.

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"), 
]

Solution 3:

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

Solution 4:

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:

  1. Running 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

  1. In Pyinstaller command, include --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