при компиляции python проекта в один файл не удается передать доп файлы и папки

Если я с помощью pyinstaller компилилю проект в виде папки, передавая доп. нужные для меня файлы, все работает замечательно.

py -3.9 -m PyInstaller --add-data 'data.json;.' --add-data 'platforms;platforms' main.py

Но если я хочу сделать в виде одного файла, ничего не работает, так-как моя прога не видит папку platforms и json.

py -3.9 -m PyInstaller -F --add-data 'data.json;.' --add-data 'platforms;platforms' main.py


Ответы (2 шт):

Автор решения: n1tr0xs

Ваши файлы, добавленные ключом(ами) --add-data, упаковуются в тот же exe потому что вы указали, что хотите получить один файл.
Вы можете это увидеть, если пройдете по пути, который хранится в переменной __file__. В этой папке будут все ваши файлы, добавленные ключом(ами) --add-data.
Соответственно, чтобы обращаться к этим файлам нужно немного изменить код.


Вариант 1:
Изменить текущий рабочий каталог. Это позволит вам открывать файлы как вы это делали раньше, например:

import os
os.chdir('/'.join(__file__.split('\\')[:-1]))

with open('some.txt', 'r') as file: 
    text = file.read()

Вариант 2:
Можно перед каждым обращением к файлу прописывать этот путь. Это выглядит так:

__FILE__PATH__ = '/'.join(__file__.split('\\')[:-1]) + '/'

with open(__FILE__PATH__+'some.txt', 'r') as file: 
    text = file.read()
→ Ссылка
Автор решения: Yant

Мне помогло то, что я добавил в код:

import PyQt5
import os

pyqt = os.path.dirname(PyQt5.__file__)
os.environ['QT_PLUGIN_PATH'] = os.path.abspath(os.path.join(pyqt, "Qt/plugins"))

И во-вторых, вместо этого:

--add-data 'platforms;platforms'

вписал это:

--add-data 'PyQt5;PyQt5'

Предварительно добавив эту папку в проект и подчистив ее:

введите сюда описание изображения

Полностью команда в моем случае выглядит так:

py -3.9 -m PyInstaller --add-data 'data.json;.' --add-data 'PyQt5;PyQt5' --hidden-import "os" -F main.py


PS Но осталась только проблема с JSON, программа его видит, но если изменить в нем что-то и перезапустить программу, все что изменил, исчезнет.

→ Ссылка