1 exe из нескольких файлов (pyarmor)

Как можно сделать 1 exe файл при помощи pyarmor?
Вся сложность заключается в том, что программа состоит из бд sqlite и нескольких py файлов и все они лежат в одной папке. А еще в этой папке есть другие папки с питон файлами, которые тоже должны быть включены в exe.
Как указать в pyarmor, что нужно сделать 1 exe из всех этих файлов?


Ответы (1 шт):

Автор решения: Mus1k

PyArmor использует PyInstaller для упаковки скриптов в exe'шник.
Подробнее: https://pyarmor.readthedocs.io/en/latest/usage.html#packing-obfuscated-scripts https://pyarmor.readthedocs.io/en/latest/examples.html

Соответственно, для того, что бы добавлять доп.файлы, нужно использовать синтаксиз команды PyInstaller вместе с PyArmor. А именно: пишем команду pyarmor pack и добавляем -e "args".

Если ваши py модули находятся в одной папке с главным скриптом, то ничего добавлять не нужно, pyinstaller сам все найдет, однако с файлами типа изображений, музыки и б.д. и т.д. все обстоит иначе. Тут на помощь приходит --add-data. Использование --add-data

--add-data Путь-до-файла/папки-в-основном-каталоге;Путь-до-файла/папки-где-он-должен-будет-быть-в-exe'шнике.

Например:

--add-data sqlite3_data_base.db;sqlite3_data_base.db 

В таком случае файл sqlite3_data_base.db в exeшнике будет находится в папке sqlite3_data_base.db. Если вам нужно держать файл в основной директории, пишем вот так:

--add-data sqlite3_data_base.db;.

По итогу ваша команда должна выглядеть примерно так:

pyarmor pack -e "--add-data sqlite3_data_base.db;." my_file.py

Теперь по поводу обращения к файлу уже в самом скрипте. Дело в том, что вы не можете обратится к файлу, который лежит в самом exe'шнике. Однако при запуске программы все внутренности exe'шника распаковываются во временную папку. Потому в коде нужно прописать такую функцию (из официальной документации 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
        base_path = sys._MEIPASS
    except Exception:
        base_path = os.path.abspath(".")

    return os.path.join(base_path, relative_path)

Использовать эту функцию нужно везде, где вы указывается скрипту путь до файла, который лежит по идее в exe'шнике. Например:

some_path = resource_path('sqlite3_data_base.db')

Более подробно о PyInstaller: https://pyinstaller.readthedocs.io/en/stable/

→ Ссылка