При упаковке в один файл с помощью PyInstaller, запуск .exe распакует все в папку в вашем каталоге TEMP, запустит скрипт, а затем отбросит временные файлы. Путь к временной папке меняется при каждом запуске, но ссылка на ее местоположение добавляется к sys
как sys._MEIPASS
.
Чтобы использовать это, когда ваши коды Python читают любой файл, который также будет упакован в ваш .exe, вам нужно изменить расположение файлов, чтобы оно находилось в sys._MEIPASS
. Другими словами, вам нужно добавить его в код Python.
Ниже приведен пример использования кода по ссылке, на которую вы ссылались, для корректировки пути к файлу для правильного расположения при упаковке в один файл.
Пример
# data_files/data.txt
hello
world
# myScript.py
import sys
import os
def resource_path(relative_path):
""" Get absolute path to resource, works for dev and for PyInstaller """
try:
# PyInstaller creates a temp folder and stores path in _MEIPASS
base_path = sys._MEIPASS
except Exception:
base_path = os.path.abspath(".")
return os.path.join(base_path, relative_path)
def print_file(file_path):
file_path = resource_path(file_path)
with open(file_path) as fp:
for line in fp:
print(line)
if __name__ == '__main__':
print_file('data_files/data.txt')
Запуск PyInstaller со следующими параметрами упаковывает файл:
pyinstaller --onefile --add-data="data_files/data.txt;data_files" myScript.py
создает myScript.exe, который работает правильно и может открывать и читать упакованный файл данных.