Как собрать все ресурсы в один исполняемый файл? - PullRequest
5 голосов
/ 14 июля 2011

Я написал приложение GTK с python.

Весь графический интерфейс пользователя находится в файле glade, и здесь используются некоторые изображения.Я хочу скомпилировать мое приложение в EXEcutable файл.Для этого я использую PyInstaller компилятор и UPX упаковщик.

Я сделал, как сказано в руководстве:

python Configure.py
python Makespec.py --onefile --windowed --upx /path/to/yourscript.py
python Build.py /path/to/yourscript.spec

PyInstaller отлично работает и создает один исполняемый файл.Но чтобы приложение работало корректно, мне нужно скопировать мои glade и image файлы в папку exe.

Есть ли способ скомпилировать эти файлы висполняемый файл?

Я отредактировал свой spec-файл различными способами, но не могу добиться того, чего хочу.Приведенный ниже спецификационный файл копирует только файл в каталог, но не компилирует в исполняемый файл

Ответы [ 3 ]

6 голосов
/ 14 июля 2011

С несколькими изменениями вы можете включить все в свой исходный код и, следовательно, в свой исполняемый файл.

Если вы запускаете gdk-pixbuf-csource для файлов изображений, вы можете преобразовать их в строки, которые затем можно загрузить с помощью gtk.gdk.pixbuf_new_from_inline().

Вы также можете включить свой файл Glade в виде строки в программу и затем загрузить его, используя gtk.Builder.add_from_string().

6 голосов
/ 06 октября 2011

PyInstaller действительно позволяет вам объединить все ваши ресурсы в exe, без хитрости превращения ваших файлов данных в файлы .py - ваш объект COLLECT кажется правильным, сложный шаг - получить доступ к этимфайлы во время выполнения.PyInstaller распакует их во временный каталог и сообщит вам, где они находятся, с помощью переменной _MEIPASS2.Чтобы получить пути к файлам как в разработке, так и в упакованном режиме, я использую это:

def resource_path(relative):
    return os.path.join(
        os.environ.get(
            "_MEIPASS2",
            os.path.abspath(".")
        ),
        relative
    )


# in development
>>> resource_path("gui.glade")
"/home/shish/src/my_app/gui.glade"

# in deployment
>>> resource_path("gui.glade")
"/tmp/_MEI34121/gui.glade"
1 голос
/ 14 июля 2011

Есть ли способ скомпилировать эти файлы в исполняемый файл?

Строго говоря: нет, потому что вы компилируете исходный код , в то время как файл glade является XML иизображения являются двоичными данными.Что вы обычно делаете, это создаете установщик (т.е. самораспаковывающийся архив, который будет помещать различные файлы в правильные каталоги при запуске установщика).

РЕДАКТИРОВАТЬ: Если ваша проблемапросто иметь исполняемый файл с одним файлом (так что речь идет не о «компиляции», а о количестве файлов, постоянно записываемых в файловой системе), вы можете попытаться использовать этот скрипт на основе py2exe .Что он делает, это создает временные файлы при каждом запуске программы, удаляя их по завершении выполнения.

EDIT2: Очевидно, что вы запрашиваете также возможно в PyInstaller .Из документации :

По умолчанию pyinstaller.py создает каталог распространения, содержащий основной исполняемый файл и динамические библиотеки.Опция --onefile указывает, что вы хотите, чтобы PyInstaller создавал один файл со всем внутри.

...