Ошибка типа: ожидаемые str, байты или os.Объект, подобный пути, а не WindowsPath при преобразовании .py с использованием Pyinstaller

#python #matplotlib #pyinstaller

#python #matplotlib #pyinstaller

Вопрос:

При попытке создать .exe с помощью Pyinstaller выдается эта ошибка:

     133235 INFO: Loading module hook 'hook-matplotlib.backends.py' from 'c:\users\jimit vaghela\appdata\local\programs\python\python37\lib\site-packages\PyInstaller\hooks'...
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "c:usersjimit vaghelaappdatalocalprogramspythonpython37libsite-packagesmatplotlib__init__.py", line 901, in <module>
    fail_on_error=True)
  File "c:usersjimit vaghelaappdatalocalprogramspythonpython37libsite-packagesmatplotlib__init__.py", line 796, in _rc_params_in_file
    with _open_file_or_url(fname) as fd:
  File "c:usersjimit vaghelaappdatalocalprogramspythonpython37libcontextlib.py", line 112, in __enter__
    return next(self.gen)
  File "c:usersjimit vaghelaappdatalocalprogramspythonpython37libsite-packagesmatplotlib__init__.py", line 770, in _open_file_or_url
    fname = os.path.expanduser(fname)
  File "c:usersjimit vaghelaappdatalocalprogramspythonpython37libntpath.py", line 291, in expanduser
    path = os.fspath(path)
TypeError: expected str, bytes or os.PathLike object, not WindowsPath
134074 INFO: Loading module hook 'hook-matplotlib.py' from 'c:\users\jimit vaghela\appdata\local\programs\python\python37\lib\site-packages\PyInstaller\hooks'...
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "c:usersjimit vaghelaappdatalocalprogramspythonpython37libsite-packagesmatplotlib__init__.py", line 901, in <module>
    fail_on_error=True)
  File "c:usersjimit vaghelaappdatalocalprogramspythonpython37libsite-packagesmatplotlib__init__.py", line 796, in _rc_params_in_file
    with _open_file_or_url(fname) as fd:
  File "c:usersjimit vaghelaappdatalocalprogramspythonpython37libcontextlib.py", line 112, in __enter__
    return next(self.gen)
  File "c:usersjimit vaghelaappdatalocalprogramspythonpython37libsite-packagesmatplotlib__init__.py", line 770, in _open_file_or_url
    fname = os.path.expanduser(fname)
  File "c:usersjimit vaghelaappdatalocalprogramspythonpython37libntpath.py", line 291, in expanduser
    path = os.fspath(path)
TypeError: expected str, bytes or os.PathLike object, not WindowsPath
  

Я нашел решение, опубликованное в Stackoverflow, в котором указано, что необходимо вставить код в backend.py в папке Pyinstaller. Но это тоже не работает.

Что здесь происходит не так?

Ответ №1:

Итак, я выяснил, что matplotlib была проблема. Исключение этого в аргументе модуля в Pyinstaller исправило это.

Вот так:

pyinstaller --exclude-module matplotlib main.py

Комментарии:

1. Но что, если кто-то хочет фактически включить matplotlib?

2. В то время у matplotlib возникали проблемы с конфликтом с Pyinstaller, даже базовые crud-приложения не работали с pyinstall, в котором в любом случае был задействован matplotlib. Я не уверен, что вызывает ошибку здесь.

3. @WouterLievens Может быть, вы могли бы понизить версию вашего matplotlib, которая вроде как помогла одному пользователю в прошлом, когда я искал решения.

4. @WouterLievens, не могли бы вы, пожалуйста, уточнить?

Ответ №2:

В настоящее время это проблема с matplotlib .

Я решил это, отредактировав исходный файл. Если вы не хотите редактировать исходный файл, говорят, что для устранения этой проблемы могут быть установлены более низкие версии matplotlib like 3.0.3 .

В моем случае это не сработало. В любом случае, ниже приведены шаги, которые я предпринял.

Сначала откройте интерпретатор Python и скопируйте путь, который вы получите в качестве выходных данных.

 >>> import matplotlib
>>> matplotlib.get_data_path() # copy the below path
'C:\<Python Path>\lib\site-packages\matplotlib\mpl-data'
  

Далее откройте файл C:<Python Path>libsite-packagesPyInstallerhookshook-matplotlib.py . Просто на всякий случай сделайте резервную копию этого файла, если вам нужно

 from PyInstaller.utils.hooks import exec_statement

# old line; delete this
mpl_data_dir = exec_statement(
    "import matplotlib; print(matplotlib.get_data_path())")

# Add this line
mpl_data_dir = 'C:\<Python Path>\lib\site-packages\matplotlib\mpl-data'

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

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

  

И не забудь сохранить.