Как упаковать .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
И радуйтесь)
Это просто, в том числе проще, чем об этом везде пишут (и здесь тоже). Давайте рассмотрим одну единственную команду в командном файле, используемом мной лично, которая выполняет всю работу:
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 есть сайт, хотя и на английском. Всё, что я тут рассказываю, взято, естественно, оттуда.