Как упаковать .txt файл в exe с помощью PyInstaller?

В гугле куча подобных вопросов, но вот ответов - нет, к сожалению. Имеется Python скрипт, который хранит некие параметры в текстовом файле. То есть просто читает его/записывает в него через open("file.txt"). Подскажите новичку, есть ли простой способ упаковать его в exe pyinstaller'ом?


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

Автор решения: Александр

При запуске утилиты pyinstaller, естественно с аргументами.

Генерируется файл с расширением .spec

Типа такого:

# -*- mode: python -*-

block_cipher = None


a = Analysis(['main.py'],
         pathex=['C:\\PY_EXE\\Exsample'],
         binaries=[],
         datas=[],
         hiddenimports=[],
         hookspath=[],
         runtime_hooks=[],
         excludes=[],
         win_no_prefer_redirects=False,
         win_private_assemblies=False,
         cipher=block_cipher)

a.datas += [('Имя> file.txt','Полный путь до файла> C:\\file.txt ','Тип> TXT')] #<--Внимание на эту строку её нужно добавить в этот spec файл 

pyz = PYZ(a.pure, a.zipped_data,
         cipher=block_cipher)
exe = EXE(pyz,
      a.scripts,
      a.binaries,
      a.zipfiles,
      a.datas,
      name='main',
      debug=False,
      strip=False,
      upx=True,
      runtime_tmpdir=None,
      console=True )

И ещё один нюанс нужно в вашем файле file.py

Создать такую функцию:

def resource_path(relative):
    if hasattr(sys, '_MEIPASS'):
        return os.path.join(sys._MEIPASS, relative)
    else:
        return os.path.join(os.path.abspath("."), relative)

# Доступ к file.txt только так
with open(resource_path('file.txt'), 'r') as file:
    file.read()
    pass

Теперь заново соберите EXE-ник только теперь таким образом:

pyinstaller file.spec

И радуйтесь)

→ Ссылка
Автор решения: Fox Fox

Это просто, в том числе проще, чем об этом везде пишут (и здесь тоже). Давайте рассмотрим одну единственную команду в командном файле, используемом мной лично, которая выполняет всю работу:

pyinstaller -y --uac-admin --clean ^
--onedir --runtime-tmpdir="." --distpath="." --contents-directory="Runtimes" ^
--add-data=".\DB\rhymes.db;DB" ^
--add-data=".\HELP\rhymes.pdf;HELP" ^
--hide-console=hide-early --icon=..\IMAGES\app.png .\rhymes.py

О назначении всех опций могу рассказать, а можете поинтересоваться сами. К данной теме относится опция "--add-data". Мы видим, что в каталог с разнообразными требуемыми компонентами добавляются:

каталог DB, содержащий rhymes.db;
каталог HELP, содержащий rhymes.pdf.

Таких файлов в нужные Вам каталоги можно добавить столько, сколько нужно. Еще раз о структуре опции, к примеру: --add-data=".\DB\rhymes.db;DB":

--add-data - название опции;
.\DB\rhymes.db - файл, который нужно добавить в сборку;
DB - каталог, который нужно добавить в сборку и поместить туда требуемый файл. Если такой каталог не нужен, то указывайте "."

Все компоненты, включая Ваши каталоги DB и HELP с Вашими файлами, будут помещены в данном случае в каталог Runtimes. Обеспечить взаимодействие с этими каталогами и файлами из Вашей программы несложно (отдельная тема). Есть ещё вариант создания одного единственного файла, как результата (опция --onefile). Каталог Runtimes тоже будет помещён внутрь .exe и появляться при запуске программы в результате разархивирования. Я ранее использовал такой вариант, но вскоре отказался - нет особого смысла и выгоды, но есть проблемы, но это уже другая тема. Примечание: по поводу отсутствия информации. У pyinstaller есть сайт, хотя и на английском. Всё, что я тут рассказываю, взято, естественно, оттуда.

→ Ссылка