Подтвердить что ты не робот

Упаковка и отправка библиотеки и скриптов python, профессиональный способ

У меня есть задача упаковки и доставки коммерческого пакета приложений, который будет включать:

  • библиотека python (разработанная нами)
  • некоторые программы python в зависимости от библиотеки выше
  • дополнительные библиотеки, не разработанные нами, но которые являются зависимостями нашей библиотеки.
  • полная установка python (python 2.6)
  • дополнительные материалы, библиотеки и программы на других языках. Здесь не проблема, так как они не подключены к вышеуказанным машинам, и текущий процесс доставки уже работает.

Пакет поставляется в Linux, OSX и Windows. В Linux он распространяется как простой tar.gz. Пользователь просто распаковывает tar.gz и source предоставленный bash script в .bashrc, чтобы среда была правильно настроена. На mac, это dmg. На окнах я понятия не имею. Сегодня парня окон нет, но я вижу, что exe создается каким-то образом.

Теперь я более подробно объясню вышеприведенные моменты.

Наша библиотека Python

Мы не хотим выделять источники, поэтому мы хотим предоставить только скомпилированные файлы python. Лучшая стратегия, чтобы сделать их еще более защищенными от несанкционированного доступа, приветствуется, даже если это связано с глубоким взломом (например, я когда-то видел, что магия делала импорт материалов из .zip, который был "поврежден" ad-hoc). В настоящее время в библиотеке нет кода уровня C или аналогичного кода, зависящего от платформы, но это скоро изменится. Поэтому мы должны предоставить скомпилированный .so для платформы с помощью pyc.

Очевидно, что эта библиотека будет отправлена ​​в пакет вместе с остальной частью нашего приложения. Поэтому он будет установлен на загруженном комплекте. По этой причине он должен быть полностью перемещаем, и пользователь должен каким-то образом (вручную или через наш env script) добавить местоположение необработанного пакета в PYTHONPATH, чтобы интерпретатор мог его найти.

Наши программы на Python

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

Дополнительные библиотеки

Наша библиотека зависит от сторонних библиотек, которые нам придется отправлять, так что пользователь работает без какой-либо зависимости. Очевидно, что эти библиотеки будут установлены нами в комплекте, но мы должны надеяться, что они не будут хранить путь установки где-то во время сборки, потому что это сделает их неперемещаемыми.

Наш питон

Мы отправим нашу версию python, которую предположим, что пользователь запустится, чтобы получить доступ к нашему script. Это связано с тем, что мы хотим быть уверенными в запущенной версии python. Кроме того, мы можем немного изменить исполняемый файл или стандартную библиотеку. Возможно, у нас есть проблема с взаимодействием этого питона со стандартным питоном, и если пользователю нужна определенная библиотека на нашем питоне, она должна будет установить ее в нашем комплекте, а не на стандартном месте для библиотек.

Запрос

Мне нужно решить эту задачу. Я видел это, но никогда не делал этого лично, поэтому мне нужна ваша точка зрения. То, что я представил выше, - это то, как я думаю, что все должно работать, в соответствии с тем, как все работает сейчас, но это может быть неправильно. Любые намеки, причуды, предложения или стратегии для успешного развертывания приветствуются. Учитывая сложность вопроса, я уже объявляю о высокой награде, согласно лучшему ответу, который я могу получить.

4b9b3361

Ответ 1

Это не полный ответ, а просто куча идей. Я написал установщик для клиента, который включил некоторые идеи, которые могут быть полезны для вас.

Это был только Linux, поэтому я сосредоточился именно на этом. Нам нужно было отправить специальные пользовательские версии mySQL, lighttpd, python, memcached, нескольких сторонних модулей Python и некоторых пользовательских скриптов. Нам нужно было запускать все эти службы без каких-либо проблем и позволить пользователю управлять ими с помощью обычных initscripts. Он должен хорошо работать на кучу популярных дистрибутивов и, следовательно, не должен полагаться на специфические для дистрибутива вещи.

То, что я сделал, было следующим.

  • Создал файл размером 500 МБ (я не помню размер) и отформатировал его как файловую систему ext3fs.
  • Установил его в точке с помощью устройства loopback.
  • Ran deb-bootstrap на точке монтирования для создания пользовательской установки Debian.
  • Chrooted внутри раздела, а затем запускал кучу скриптов, которые устанавливали apt-get во всех наших зависимостях, устанавливали все яйца и другие пакеты, которые были необходимы для приложения, сами устанавливали приложение в /opt (внутри chroot), установленный супервизор (для управления процессом) и настройки. Теперь этот раздел был полностью автономной файловой системой Linux, в которой содержалось приложение и все необходимое для его запуска. Вы можете свалить его где угодно, chroot внутри и запустить приложение. Единственная зависимость, которую он имел с внешним миром, - это порты, которые он будет использовать для своих сервисов, и суперконтроллер. Это было главным моментом. Мы смогли включить именно то, что нам было нужно (скомпилированные файлы, только .pycs и т.д.) Для нескольких приложений, и не требовали каких-либо ограничений в стандартных инструментах установки.
  • После этого мы упаковали несколько дополнительных скриптов, которые войдут во внешнюю операционную систему. Они были изготовлены на заказ для каждого дистрибутива, который мы должны были бы поддержать. Эта часть была специфичной для развития. Были сценарии, которые вошли бы в /etc/init.d и некоторые скрипты, которые будут настраивать базу данных и материал в начале.
  • Затем мы создали архив всей файловой системы, используя makeelf. Это будет контрольная сумма и все это, и предоставит самораспаковывающийся архив, который, если запустить, раскроет все это на /opt на хост-машине, chroot внутри каталога и запустит установку script, которая спросит у пользователя несколько вопросов, таких как db имя пользователя/пароль и т.д. После этого он будет извлекать сценарии, упомянутые мной на шаге 5, и помещать их в основную ОС.

Initscripts просто закручивается в раздел и запускает супервизор. Затем он позаботится о запуске всех услуг, о которых мы заботились. Выключение приложения было простым подключением к запуску supervisord и запуском команды. Мы завернули это в initscript, чтобы пользовательский интерфейс был UNIX.

Теперь мы предоставим клиентам самораспаковывающийся файл run. Они запустили его, задали несколько вопросов и создали каталог под /opt, в котором содержалось наше приложение и все его зависимости. Сценарии инициализации будут изменены, чтобы запустить наше приложение при загрузке, и все будет работать так, как ожидалось.

Я думаю, что шаг 4 дает вам свободу устанавливать все, что угодно, но вы хотите, чтобы все было хорошо.

Ответ 2

Вы можете использовать Makeself, который похож на tar.gz, но создает .sh, который самораспаковывается и позволяет выполнить пользовательской установки script (не спрашивайте меня о Windows). Это позволяет избежать установки установленного Python, который почти наверняка не сработает - вместо этого вы можете включить установщик.

Ваш код и зависимости, разработанные вами, должны быть включены как пакеты, созданные sdist, которые могут быть установлены PIP и easyinstall в virtualenv на основе вашего python. В вашем Manifest.in вы можете легко включить только файлы pyc и все остальное, что необходимо, и исключить файлы py, чтобы никто не видел ваши источники. Зависимости будут установлены автоматически, загрузив их, но вы можете избежать этого, включив их в свой архив, например, ваши зависимости. Просто поместите их в каталог и добавьте "-f file: path_to_your_directory" к вызову PIP.

Ответ 3

Я не совсем понимаю, как ваши пользователи в конечном итоге используют программу, поэтому извиняйтесь, если это не полезно.

Вы просмотрели py2exe и py2app? Они позволят вам создать гораздо более запутанный исполняемый файл в Windows и OS X, который может быть еще проще. Меньше зависимостей и вещей, чтобы пойти не так.

Мы развернули внутреннее, корпоративное приложение с py2exe, и это было тривиально. Независимо от того, какие другие питоны у пользователя были или не имели нашего script, он был простым мастером установки и работал надежно. Он включал в себя ряд библиотек Python и C, которые нам пришлось связывать вместе с интерпретатором python. Однако мы не пытались скрыть содержимое, просто сделайте это легко.

Ответ 4

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

  • Сохраняйте потенциальные зависимости для интерпретатора python, например. на Linux python зависит от glibc. Попробуйте либо скопировать его статически, либо использовать очень распространенную версию glibc. Возможно, вам стоит взглянуть на активировать дистрибутив python; проблема в том, что они хотят получить за это много денег.

  • Рассмотрите возможность использования формата пакета, такого как DEB или RPM, вместо tar.gz для linux. Это позволит вам разрешать зависимости, если они есть, и облегчит процесс обновления.

  • Даже если вы хотите распространять свое приложение как tar.gz, я бы рекомендовал создать пакет для этого приложения. Не обязательно для пользователя, но для вас, когда вы строите среду, которая должна работать на сайте клиента. Это позволило бы легче протестировать и построить и обновить среду.

Ответ 5

Это будет зависеть от вашего целевого рынка. В специализированных отраслях ниши существует больше разнообразия в распространении материала. В сильно коммодитизированных областях я ожидал бы родной пакет ОС (по крайней мере, если бы я был клиентом). Я склонен воспринимать качество пакета развертывания как показатель качества программного обеспечения в целом. Я сопоставляю родные пакеты ОС как более высокое качество, чем другие форматы, в основном потому, что информация о зависимости может быть полной. Это упрощает выполнение некоторых проверок соответствия и управления изменениями.

Собственные пакеты ОС

  • Для Unices рассмотрим возможность создания собственных пакетов ОС. Они обеспечивают лучшую интеграцию и видимость с такими процессами, как соблюдение, управление изменениями, управление зависимостями и т.д.
  • Для OSX другие уже предложили py2app. Вы также можете использовать формат пакета MacPorts или формат пакета Fink.
  • Для Windows другие уже предложили py2exe.

Требования к перемещению и конфигурации

  • Поместите свой исполняемый файл Python под .../libexec. Это предотвращает случайное вызов.
  • Измените имя исполняемого файла Python, чтобы предотвратить путаницу. то есть. /usr/local/libexec/<pkg>_python
  • Распределите .py для бункеров, чтобы сделать их легко перемещаемыми. Вы можете изменить Magic Cookie во время установки в любое место, где был установлен ваш Python, с помощью установки script. Единственный код, который вам нужен в ящике, - это строка, которая вызывает вашу lib, которая является pyc.
  • Установите свои библиотеки в правильном месте в /usr/local/lib/app_python/site_package/..., и вам не нужно будет использовать PYTHONPATH.

Общие библиотеки

  • Если я правильно помню, вы захотите, чтобы вы удалили любые записи rpath из libs, поскольку это может испортить их способность к перемещению.
  • Собственная упаковка ОС должна помочь с любыми зависимостями, которые требуют общие библиотеки.

Ответ 6

Правильный способ сделать это (без доставки собственного Python) - создать Яйца Python, который затем может быть установлен менеджером пакетов Python, например easy_install или pip. Настройка и установка выполняются с помощью setup.py, который представляет собой всего лишь Python script, поэтому при необходимости вы можете включать все виды нестандартных процедур настройки.

При использовании pip легко установить яйца в virtualenv, что сделает его изолированным от пользователя Установка Python (кроме самого бинарного интерпретатора).

Ответ 7

Для окон я делаю это:

  • Используйте cx_freeze следующим образом:

    c:\Python27\Scripts\cxfreeze.bat source.py --target-dir=Bin 
    --base-name=Win32GUI --icon=icon.ico --target-name=Executable.exe
    

    Это создает каталог с исполняемой программой.
    Вы можете использовать другое приложение для упаковки, такое как PyInstaller (Windows, Linux), Py2Exe (Windows) или Py2App (Mac), но я получил наилучшие результаты с cx_freeze (возможно, все упомянутые вами платформы). Он также имеет очень хорошую поддержку и по-прежнему активно поддерживается.

  • Упакуйте все, используя Inno Setup (Windows).
    Вы можете использовать любой метод для создания установщика, который вам нравится. Я не знаком с другими платформами.

  • Проверяйте его в VMware виртуальной машине на чистой установке ОС, чтобы быть уверенным.

На самом деле, это очень легко сделать, я не уверен, что добавить.


Изменить: Вы также можете использовать Portable Python для вашей связанной среды в Windows.

Ответ 8

Насколько я вижу, Python распространяется через файл msi. Для меня кажется естественным, что вы также создаете установщик msi. Чтобы создать файлы msi, вы можете использовать, например. Инструментарий Windows Installer Extensions. Если вы создаете свой собственный msi и включаете другие msi в свои, то вам будет сложно установить пакет pyhthon во время вашей собственной процедуры установки msi, поскольку Windows делает только одну установку за раз. Самый простой способ - переупаковка python msi в ваш собственный msi и распространение этого. Вы можете декомпилировать msi в xml файл, который можно использовать для создания нового msi с dark, который является частью набора инструментов установщика Windows Installer,

Если вы управляете им, чтобы развернуть весь свой пакет через tar файл, у него также будет возможность использовать zip файл в Windows, если pyhthon и другие ваши файлы будут доступны для xcopy. Когда вы должны выполнить некоторые действия, такие как установка разделов реестра, переменных среды, создание ярлыков, вы должны использовать msi, поскольку он был разработан для этой задачи. Но будьте осторожны: Msi - сложная тема. Если вам нужно что-то ускорить, вы должны проверить, насколько далеко вы можете получить файл zip и некоторые скрипты. Установка на основе msi упростит обслуживание и исправление, но для ознакомления с этими расширенными функциями вам потребуется потратить несколько недель, чтобы изучить его.

Ответ 9

Хотя на это очень хорошо ответил, я все же хочу связать это с моим сообщением, поскольку у нас была такая же проблема. Некоторым людям может показаться полезным CX_Freeze Linux Python Packaging