Создание пакета развертывания со всеми зависимостями [дубликат]

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

Однако вам следует избегать нескольких подключений от одного и того же сценария, независимо от одного API или другого. Поскольку это будет обременять ваш сервер базы данных и исчерпывать его ресурсы. Итак, хотя технически вы можете, вы не должны смешивать разные расширения в своем коде, за исключением короткого периода рефакторинга.

19
задан Rudolf Olah 5 July 2013 в 16:27
поделиться

6 ответов

Вы можете автоматизировать большую часть работы с помощью обычных инструментов python. Начнем с чистого virtualenv.

[zart@feena ~]$ mkdir ziplib-demo
[zart@feena ~]$ cd ziplib-demo
[zart@feena ziplib-demo]$ virtualenv .
New python executable in ./bin/python
Installing setuptools.............done.
Installing pip...............done.

Теперь давайте установим набор пакетов, которые войдут в zip-библиотеку. Трюк состоит в том, чтобы принудительно установить их в конкретный каталог.

(Примечание: не используйте опцию -egg либо в командной строке, либо в файле pip.conf / pip.ini, потому что это приведет к поломке макета файла он не импортируется в zip)

[zart@feena ziplib-demo]$ bin/pip install --install-option --install-lib=$PWD/unpacked waitress
Downloading/unpacking waitress
  Downloading waitress-0.8.5.tar.gz (112kB): 112kB downloaded
  Running setup.py egg_info for package waitress

Requirement already satisfied (use --upgrade to upgrade): setuptools in ./lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg (from waitress)
Installing collected packages: waitress
  Running setup.py install for waitress

    Installing waitress-serve script to /home/zart/ziplib-demo/bin
Successfully installed waitress
Cleaning up...

Обновление: у pip теперь есть переключатель -t <path>, который делает то же, что и --install-option --install-lib=.

Теперь давайте упакуем все из них в один zip

[zart@feena ziplib-demo]$ cd unpacked
[zart@feena unpacked]$ ls
waitress  waitress-0.8.5-py2.7.egg-info
[zart@feena unpacked]$ zip -r9 ../library.zip *
  adding: waitress/ (stored 0%)
  adding: waitress/receiver.py (deflated 71%)
  adding: waitress/server.pyc (deflated 64%)
  adding: waitress/utilities.py (deflated 62%)
  adding: waitress/trigger.pyc (deflated 63%)
  adding: waitress/trigger.py (deflated 61%)
  adding: waitress/receiver.pyc (deflated 60%)
  adding: waitress/adjustments.pyc (deflated 51%)
  adding: waitress/compat.pyc (deflated 56%)
  adding: waitress/adjustments.py (deflated 60%)
  adding: waitress/server.py (deflated 68%)
  adding: waitress/channel.py (deflated 72%)
  adding: waitress/task.pyc (deflated 57%)
  adding: waitress/tests/ (stored 0%)
  adding: waitress/tests/test_regression.py (deflated 63%)
  adding: waitress/tests/test_functional.py (deflated 88%)
  adding: waitress/tests/test_parser.pyc (deflated 76%)
  adding: waitress/tests/test_trigger.pyc (deflated 73%)
  adding: waitress/tests/test_init.py (deflated 72%)
  adding: waitress/tests/test_utilities.pyc (deflated 78%)
  adding: waitress/tests/test_buffers.pyc (deflated 79%)
  adding: waitress/tests/test_trigger.py (deflated 82%)
  adding: waitress/tests/test_buffers.py (deflated 86%)
  adding: waitress/tests/test_runner.py (deflated 75%)
  adding: waitress/tests/test_init.pyc (deflated 69%)
  adding: waitress/tests/__init__.pyc (deflated 21%)
  adding: waitress/tests/support.pyc (deflated 48%)
  adding: waitress/tests/test_utilities.py (deflated 73%)
  adding: waitress/tests/test_channel.py (deflated 87%)
  adding: waitress/tests/test_task.py (deflated 87%)
  adding: waitress/tests/test_functional.pyc (deflated 82%)
  adding: waitress/tests/__init__.py (deflated 5%)
  adding: waitress/tests/test_compat.pyc (deflated 53%)
  adding: waitress/tests/test_receiver.pyc (deflated 79%)
  adding: waitress/tests/test_adjustments.py (deflated 78%)
  adding: waitress/tests/test_adjustments.pyc (deflated 74%)
  adding: waitress/tests/test_server.pyc (deflated 73%)
  adding: waitress/tests/fixtureapps/ (stored 0%)
  adding: waitress/tests/fixtureapps/filewrapper.pyc (deflated 59%)
  adding: waitress/tests/fixtureapps/getline.py (deflated 37%)
  adding: waitress/tests/fixtureapps/nocl.py (deflated 47%)
  adding: waitress/tests/fixtureapps/sleepy.pyc (deflated 44%)
  adding: waitress/tests/fixtureapps/echo.py (deflated 40%)
  adding: waitress/tests/fixtureapps/error.py (deflated 52%)
  adding: waitress/tests/fixtureapps/nocl.pyc (deflated 48%)
  adding: waitress/tests/fixtureapps/getline.pyc (deflated 32%)
  adding: waitress/tests/fixtureapps/writecb.pyc (deflated 42%)
  adding: waitress/tests/fixtureapps/toolarge.py (deflated 37%)
  adding: waitress/tests/fixtureapps/__init__.pyc (deflated 20%)
  adding: waitress/tests/fixtureapps/writecb.py (deflated 50%)
  adding: waitress/tests/fixtureapps/badcl.pyc (deflated 44%)
  adding: waitress/tests/fixtureapps/runner.pyc (deflated 58%)
  adding: waitress/tests/fixtureapps/__init__.py (stored 0%)
  adding: waitress/tests/fixtureapps/filewrapper.py (deflated 74%)
  adding: waitress/tests/fixtureapps/runner.py (deflated 41%)
  adding: waitress/tests/fixtureapps/echo.pyc (deflated 42%)
  adding: waitress/tests/fixtureapps/groundhog1.jpg (deflated 24%)
  adding: waitress/tests/fixtureapps/error.pyc (deflated 48%)
  adding: waitress/tests/fixtureapps/sleepy.py (deflated 42%)
  adding: waitress/tests/fixtureapps/toolarge.pyc (deflated 43%)
  adding: waitress/tests/fixtureapps/badcl.py (deflated 45%)
  adding: waitress/tests/support.py (deflated 52%)
  adding: waitress/tests/test_task.pyc (deflated 78%)
  adding: waitress/tests/test_channel.pyc (deflated 78%)
  adding: waitress/tests/test_regression.pyc (deflated 68%)
  adding: waitress/tests/test_parser.py (deflated 80%)
  adding: waitress/tests/test_server.py (deflated 78%)
  adding: waitress/tests/test_receiver.py (deflated 87%)
  adding: waitress/tests/test_compat.py (deflated 51%)
  adding: waitress/tests/test_runner.pyc (deflated 72%)
  adding: waitress/__init__.pyc (deflated 50%)
  adding: waitress/channel.pyc (deflated 58%)
  adding: waitress/runner.pyc (deflated 54%)
  adding: waitress/buffers.py (deflated 74%)
  adding: waitress/__init__.py (deflated 61%)
  adding: waitress/runner.py (deflated 58%)
  adding: waitress/parser.py (deflated 69%)
  adding: waitress/compat.py (deflated 69%)
  adding: waitress/buffers.pyc (deflated 69%)
  adding: waitress/utilities.pyc (deflated 60%)
  adding: waitress/parser.pyc (deflated 53%)
  adding: waitress/task.py (deflated 72%)
  adding: waitress-0.8.5-py2.7.egg-info/ (stored 0%)
  adding: waitress-0.8.5-py2.7.egg-info/dependency_links.txt (stored 0%)
  adding: waitress-0.8.5-py2.7.egg-info/installed-files.txt (deflated 83%)
  adding: waitress-0.8.5-py2.7.egg-info/top_level.txt (stored 0%)
  adding: waitress-0.8.5-py2.7.egg-info/PKG-INFO (deflated 65%)
  adding: waitress-0.8.5-py2.7.egg-info/not-zip-safe (stored 0%)
  adding: waitress-0.8.5-py2.7.egg-info/SOURCES.txt (deflated 71%)
  adding: waitress-0.8.5-py2.7.egg-info/entry_points.txt (deflated 33%)
  adding: waitress-0.8.5-py2.7.egg-info/requires.txt (deflated 5%)
[zart@feena unpacked]$ cd ..

Обратите внимание, что эти файлы должны быть в верхней части zip, вы можете не просто zip -r9 library.zip unpacked

Проверка результата:

[zart@feena ziplib-demo]$ PYTHONPATH=library.zip python
Python 2.7.1 (r271:86832, Apr 12 2011, 16:15:16)
[GCC 4.6.0 20110331 (Red Hat 4.6.0-2)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import waitress
>>> waitress
<module 'waitress' from '/home/zart/ziplib-demo/library.zip/waitress/__init__.pyc'>
>>>
>>> from wsgiref.simple_server import demo_app
>>> waitress.serve(demo_app)
serving on http://0.0.0.0:8080
^C>>>

Обновление: поскольку python 3.5 также zipapp module , который может помочь связать весь пакет с файлом .pyz. Для более сложных задач pyinstaller , py2exe или py2app может лучше соответствовать счету.

28
ответ дан Zart 21 August 2018 в 10:11
поделиться

Ну, вы можете создать свои собственные «пакеты / яйца» в вашем {app-home-dir / packages} (например, справившись с яйцами) и настроить дополнительные файлы в setup.py (setuptools), чтобы упаковать все это как единое распределение ( Что такое setup.py?). Обратите внимание, что перед тем, как вы запустите основную функцию приложения, вам необходимо сообщить Python, где именно ваши внешние «пакеты / яйца», - добавив {app-home-dir / packages} в sys.path. Это облегчает создание автономного пакета. Однако с этим связаны опасения относительно зависимостей и их версий, модули Python, смешанные с кодом Ansi C и т. Д.

0
ответ дан Community 21 August 2018 в 10:11
поделиться

Вы можете использовать самораспаковывающийся zip-файл , настроенный для запуска интерпретатора Python после распаковки яиц из того же .exe-файла, который содержит их.

0
ответ дан John Zwinck 21 August 2018 в 10:11
поделиться

Да, один zip-файл / яйцо может предоставить несколько модулей, поэтому вы можете объединить их в один файл. Однако я очень скептически отношусь к тому, что это хорошая идея. Вам все равно нужно установить этот zip-файл, и он все еще может столкнуться с другими уже установленными версиями и т. Д.

Итак, первый вопрос, который стоит задать, - это цель. Зачем нужен только один файл? Это простота установки или простота распространения, или что?

. Только один файл не сделает установку проще, есть и другие, более эффективные способы. Вы можете позволить загружать и устанавливать установки автоматически, это легко сделать.

И наличие их в одном zip-файле по-прежнему означает, что вам нужно развернуть этот zip-файл и запустить setup.py, который isn Это очень удобно.

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

1
ответ дан Lennart Regebro 21 August 2018 в 10:11
поделиться
  • 1
    В частности, распространение автономного приложения python на компьютер без установленного на нем python ; то есть. вы создаете пользовательский бинарный код python из источника, который загружает определенную загрузочную строку (например, «import blah; blah.main ()») после импорта zip-файла в путь. Это позволяет распространять все приложение python в виде двоичного файла + zip. Очень удобно. Работает отлично; но не тогда, когда у вас есть зависимости от библиотек. – Doug 6 July 2013 в 07:50
  • 2
    Также загрузите автоматически? Учитывая, что на прошлой неделе pypi.python.org не хватало часов, я бы сказал, что для хорошего пользовательского опыта это ужасная идея. Даже просто загружать вещи, когда это происходит, приводит к таймаутам в половину времени. Абсолютно не заинтересован в том, чтобы спуститься по этому пути. – Doug 6 July 2013 в 07:52

Python будет выполнять zip-файлы, как если бы они были одиночными скриптами, если они содержат файл __main __. py [c] внутри верхнего уровня. Импорт пакетов также будет проверять внутри zip, что __main__ выполняется изнутри.

Итак, создайте свой setup.py (здесь py_modules = ['__main__'] важно указать все ваши пакеты и другие модули).

Затем запустите python setup.py bdist --format zip, чтобы создать zip-файл. Теперь, если вы хотите, чтобы он исполнялся, вы можете сделать следующее. На этом этапе вы можете выполнить полученный zip-файл, как и любой другой скрипт python.

Еще один шаг для пользователей Linux / Mac, которые читают это, чтобы улучшить удобство (хотя, вероятно, не ваш сценарий, как вы упоминаете py2exe)

echo '#!/usr/bin/env python' > my_executable_zip
cat output_of_setup_py_bdist.zip >> my_executable_zip
chmod +x my_executable_zip

Это просто добавляет #! line в zip-файл, так что при запуске из оболочки вам не нужно указывать интерпретатор. На этом этапе вы можете выполнить его как любой другой двоичный файл в системе, хотя втайне это zip-файл, полный python. Обычно я создаю make-файл для запуска setup.py, а затем выполняю это преобразование.

6
ответ дан Matt 21 August 2018 в 10:11
поделиться
  • 1
    Не забудьте сделать новый исполняемый файл zip: chmod 555 ./my_executable_zip или chmod +x ./my_executable_zip. – Chris Johnson 21 March 2014 в 16:22

Можете ли вы каким-то образом объединить все свои яйца в один ZIP-файл? Если да, то как?

Да, вы можете. Python будет загружаться из zip-архива, который добавляется в sys.path (см. PEP 273 ). Если вы поместите все библиотеки python в архив, архив рассматривается как каталог. Вот некоторые из инструментов py2exe, bbfreeze и т. Д., Чтобы изолировать библиотеки.

Что касается того, как это действительно зависит от того, как установлены ваши яйца: pip, easy_install и т. Д. Логика будет проверять все ваши зависимые яйца и собирать их путь установки, а затем застегивать яйца внутри архива.

Как вы загружаете и запускаете код из определенного яйца?

Вам нужно для определения нагрузки и запуска. Если вы говорите об импорте модуля и пакетов, вам не нужно ничего делать особо. Вот интересное сообщение в блоге по теме, в том числе некоторые caveat Packaging Python программы в качестве исполняемых ZIP-файлов

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

Это встроено до тех пор, пока яйца не являются расширениями (например, zip safe). См. Также zipimport

0
ответ дан Rod 21 August 2018 в 10:11
поделиться
  • 1
    Является ли ручная сортировка яиц и копирование подпапок действительно единственным способом? Я не могу просто создать один zip-файл со всеми папками .egg в нем? :( – Doug 6 July 2013 в 07:49
  • 2
    Кроме того, я просто попробовал это, и он, похоже, не работает; то есть. pip install blah и создать zip-файл из всех .egg-папок и попытаться импортировать; не работает вообще. :( Можете ли вы прояснить свой третий пункт случайно? – Doug 6 July 2013 в 07:53
Другие вопросы по тегам:

Похожие вопросы: