2017-02-15 13 views
2

Я пытаюсь создать один файл exe с pyinstaller, но я не уверен, какие пути файлов для изображений должны находиться в главном файле python.Путь к файлу, связанный с изображениями, содержащими pyinstaller?

В верхней части моего основного файла питона я использовал код MEIPASS:

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) 

From this page

Это текущий код у меня есть для каждого файла изображения:

root.iconbitmap('C:\\Users\\username\\Downloads\\TripApp\\BennySM.ico') 
filename = PhotoImage(file = 'C:\\Users\\username\\Downloads\\TripApp\\BgSM.gif') 

I знаете, что это не лучшие пути к файлам, но я не уверен, что мне нужно добавить, чтобы файл python знал, где искать. Набор изображений с exe, и если я добавлю exe в файл данных, он найдет изображения и запустится.

Спасибо! Я попытался добавить resource_path раньше, но мне не хватало путь к файлу в разделе определения вверху.

Еще раз спасибо!

ответ

0

Вопрос: Как использовать файл данных в программе, созданной программой 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 файл

Вот функция из примера в вопросе, переделка использовать:

  1. Абсолютный путь из примера, когда сценарий запускается как сценарий или,
  2. Путь, указанный в кортете 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')) 

 Смежные вопросы

  • Нет связанных вопросов^_^