при компиляции 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 шт):
Ваши файлы, добавленные ключом(ами) --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()
Мне помогло то, что я добавил в код:
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, программа его видит, но если изменить в нем что-то и перезапустить программу, все что изменил, исчезнет.
