Вопрос: Как использовать файл данных в программе, созданной программой pyinstaller?
Давайте сначала предположим, что сценарий питона в настоящее время работает при запуске в сценарий, и что следующая строка в скрипте:
filename = PhotoImage(file='C:\\Users\\username\\Downloads\\TripApp\\BgSM.gif')
Эта строка указывает, что сценарий извлечения файла из фиксированный каталог (вероятно, не лучший, но подходит для примера), и превращение этого файла .gif
в экземпляр объекта PhotoImage()
. Это будет наш базовый уровень.
Для успешного использования этого файла необходимо выполнить три действия, когда наш скрипт запускается как созданная программа pyinstaller
.
1. Во время сборки pyinstaller переместите файл в известном месте
Этот шаг осуществляется путем добавления datas
директиву .spec»файл`. См. this post для получения дополнительной информации о том, как это сделать. Но, короче говоря, это понадобится:
datas=[
('C:\\Users\\test\\Downloads\\TripApp\\BgSM.gif', 'data'),
...
],
Обратите внимание, что в кортеже есть два элемента. Первый элемент - это путь к нашему файлу .gif
, который существует в рабочем скрипте python, прежде чем мы упаковали его в исполняемый файл pyinstaller. Второй элемент кортежа - это каталог, в котором будет находиться файл при запуске исполняемого файла.
2. Во время выполнения, найти наш .gif
файл
Вот функция из примера в вопросе, переделка использовать:
- Абсолютный путь из примера, когда сценарий запускается как сценарий или,
- Путь, указанный в кортете
datas
, когда скрипт запускается в виде встроенной программы, использующей pyinstaller.
Код:
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,
# and places our data files in a folder relative to that temp
# folder named as specified in the datas tuple in the spec file
base_path = os.path.join(sys._MEIPASS, 'data')
except Exception:
# sys._MEIPASS is not defined, so use the original path
base_path = 'C:\\Users\\test\\Downloads\\TripApp'
return os.path.join(base_path, relative_path)
3. Сформулировать базовый для работы в нашей pyinstaller построенной программы
Так что теперь мы можем построить путь к нашей. gif
Файл при запуске в качестве сценария или в виде программы, построенной на основе pyinstaller, наша базовая линия будет:
filename = PhotoImage(file=resource_path('BgSM.gif'))