Создание портативных приложений Django — нужна помощь

Я создаю приложение Django, которое я удобно запускаю (тестирую :)) на хосте Ubuntu Linux. Я хотел бы упаковать приложение без исходного кода и распространить его на другую производственную машину. В идеале приложение можно запустить с помощью команды ./runapp, которая запускает сервер CherryPy, на котором выполняется код python/django.

Я обнаружил несколько способов сделать это:

  1. Распространение только файлов .pyc, сборка и установка всех требований на целевой машине.
  2. Использование одного из множества инструментов для упаковки приложений Python в распространяемый пакет.

Я действительно стремлюсь к варианту № 2, я бы хотел, чтобы мое приложение Django содержалось, чтобы его можно было распространять без необходимости устанавливать или настраивать дополнительные вещи. Поиск в сети дал мне больше вопросов, чем ответов, и очень кислый вкус, что упаковка Django - это тайное искусство, о котором все знают, но о котором никто не говорит. :)

Я пробовал заморозить (не удалось), Cx_freeze (не удается выполнить простую установку, версия репозитория работает, но вывод приложения не работает) и красный на dbuilder.py (который должен работать, но на самом деле не работает, я думаю). Если я правильно понимаю, большинство проблем возникает из-за того, что Django импортирует модули (пример), но я понятия не имею, как это решить.

Я буду более чем счастлив, если кто-нибудь может предоставить какие-либо указатели или хорошие ресурсы в Интернете, касающиеся упаковки/распространения автономных приложений Django.


person stricjux    schedule 07.12.2009    source источник
comment
Мне нужно отправить приложение внешнему пользователю, и я не хочу, чтобы он легко читал мой код. Я понимаю, что декомпилировать код Python не так уж сложно, но это сложнее, чем чтение (и изменение) исходных файлов.   -  person stricjux    schedule 07.12.2009
comment
Думаю, для продажи клиентам.   -  person wisty    schedule 07.12.2009
comment
@stricjux: это сложнее, чем читать (и изменять) исходные файлы. Не совсем. Этот запутанный Python является дублирующей темой. stackoverflow.com/questions/261638/how- сделай-я-защити-код-python   -  person S.Lott    schedule 07.12.2009


Ответы (2)


Я предлагаю вам создать свой дистрибутив на основе setuptools (инструмента, расширяющего стандартный механизм дистрибутива Python distutils).

Используя setuptools, вы сможете создать яйцо Python, содержащее ваше приложение. Метаданные яйца могут содержать список зависимостей, которые будут автоматически установлены easy_install (может включать Django + любые сторонние модули/пакеты, которые вы используете).

Дистрибутивы setuptools/distutils могут включать сценарии, которые будут установлены в /usr/bin, поэтому вы можете включить свой сценарий runapp.

Если вы не знакомы с virtualenv, предлагаю вам ознакомиться с ним. Это способ создания изолированных сред Python, он будет очень полезен для тестирования вашего дистрибутива.

Вот сообщение в блоге с некоторой информацией о virtualenv, а также обсуждение нескольких других полезных инструментов: Инструменты современного Python-хакера: Virtualenv, Fabric и Pip

person codeape    schedule 07.12.2009
comment
Ссылка на инструменты кажется неработающей, есть ли альтернативный источник? - person keppla; 01.10.2012

Параметр --noreload остановит автоматическое определение Django, какие модули были изменены. Не знаю, исправит ли это, но может.

Другой вариант (и он не идеален) состоит в том, чтобы скрыть некоторые из ваших основных функций, упаковав их в dll, которые будут вызываться вашим текстовым кодом.

person wisty    schedule 07.12.2009
comment
Скрытие моего кода не является целью, но спасибо за идею. Опция --noreload не решает никаких проблем (я даже не могу запустить версию cx_freezed — см. вывод: dpaste. ком/129019) - person stricjux; 07.12.2009
comment
--noreload является опцией только для встроенного в Django веб-сервера «runserver» и не применима к PyCherry или любому другому веб-серверу. - person Craig Trader; 22.08.2010