Добавление файла данных в Pyinstaller с помощью опции onefile - PullRequest
0 голосов
/ 27 июня 2018

Я пытаюсь добавить изображение в один файл, созданный Pyinstaller. Я прочитал много вопросов / форумов, таких как один и этот один , и все же он не работает.

Я знаю, что для одной файловой операции Pyinstller создает временную папку, которая может быть достигнута sys.MEIPASS. Однако я не знаю , где именно в моем сценарии я должен добавить это sys.MEIPASS.

Пожалуйста, покажите следующее:

1- Где и как следует добавить sys.MEIPASS? В скрипте Python или в файле спецификации?

2- Какую команду использовать? Я пробовал

pyinstaller --onefile --windowed --add-data="myImag.png;imag" myScript.py

или

pyinstaller --onefile --windowed myScript.py

, а затем добавьте ('myImag.png', 'imag') в файл спецификации и затем запустите

pyinstller myScript.spec

Никто не работал.

Примечание: у меня есть Python 3.6 под Windows 7

Ответы [ 2 ]

0 голосов
/ 12 июля 2018

Вот командная строка командной строки, которую я использовал, потому что мой .spec не работал. Это исключает shapely, а затем добавляет его обратно (pyinstaller с трудом компилировал его в --onefile, поэтому мне пришлось добавить модуль «вручную»). Здесь показано, как добавлять папки, а не только файлы.

pyinstaller --clean --win-private-сборки --onefile --exclude-module shapely - add-data C: \ Python27 \ Lib \ site-packages \ shapely;. \ Shapely --add-data C : \ Python27 \ tcl \ tkdnd2.8; tcl main.py

0 голосов
/ 27 июня 2018

При упаковке в один файл с помощью 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, который работает правильно и может открывать и читать упакованный файл данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...