Сжатие приложения Python в один исходный файл - PullRequest
5 голосов
/ 14 января 2011

У меня странная ситуация, когда мне нужно загрузить исходный файл Python на тестовый сервер для оценки, но я хочу, чтобы мое приложение было организовано в несколько файлов / модулей / пакетов.К сожалению, сервер тестирования находится вне моего контроля, поэтому я не могу изменить его, чтобы разрешить мне загружать ZIP-файл, содержащий мой код.

Есть ли какой-нибудь простой способ взять большое количество исходных файлов Pythonохватывает приложение и автоматически сводит их к одному исходному файлу (или .pyc-файлу)?Для простоты, только один файл будет считаться «точкой входа» и иметь if __name__ == '__main__'.Окончательный файл все еще должен быть исполняемым интерпретатором Python, поэтому я не могу использовать генератор Python-to-EXE.

1 Ответ

4 голосов
/ 14 января 2011

Если вы не можете загрузить ZIP-файл, возможно, вы можете следовать некоторым советам, содержащимся здесь . Идея состоит в том, чтобы создать и загрузить файл сценария, который содержит строку Python Shebang (игнорируется интерпретатором), добавленную к архиву zip-файла. Затем вы можете либо позволить интерпретатору Python прочитать файл zip напрямую, либо запустить его из оболочки. Чтобы это работало, вам нужно использовать хотя бы Python 2.6.

zip testapp.zip *
echo '#!/usr/bin/env python' | cat - testapp.zip > testapp.py
chmod 755 testapp.py

Выполнить либо:

python testapp.py

или

./testapp.py

Как уже говорилось в сообщении в блоге, в зависимости от того, какие версии Python вам нужно поддерживать и какие функции вам нужны, вам могут потребоваться различные изменения в исходном макете, чтобы включить необходимые файлы __main__.py и __init__.py файлы для создания правильного пакета и для создания символической ссылки __main__.py вне основного каталога пакета. Это что-то вроде клочья, но, как только вы запустите его, его будет легко автоматизировать, если ваш сервер тестирования может обрабатывать такой псевдотекстовый файл. Ключевым моментом здесь является то, что интерпретатор Python сам читает и распаковывает zip-архив, а не внешнюю программу.

Если тестирующий сервер может обрабатывать стандартные сценарии оболочки POSIX, другим вариантом может быть создание сценария, который упаковывает все в набор файлов здесь в один большой сценарий.

...