2016-07-07 1 views
3

У меня есть проект python, который имеет несколько зависимостей (определен в install_requires в setup.py). Мои операционные системы требуют, чтобы пакет был автономным и зависел только от установки python. Тест лакмусовой бумажки будет заключаться в том, что они могут получить zip-файл, а затем распаковать и запустить его без подключения к Интернету.Каков стандартный способ упаковки проекта python с зависимостями?

Есть ли простой способ упаковать установку, включая зависимости? Это приемлемо, если я должен опираться на OS/архитектуру, в которой он будет в конечном итоге запущен.

Для чего это стоит, я пробовал как setup.py build, так и setup.py sdist, но они, похоже, не вписываются в счет, так как они не включают зависимости. Я также рассмотрел virtualenv (который может быть установлен, если это абсолютно необходимо), но имеет жестко закодированные пути, что делает его менее идеальным.

+0

не думаю, что существует стандартный способ сделать это. – cel

+0

Почему не следует использовать требования.txt с зависимостями? Или запуск 'pip install -r requirements.txt' неприемлем? – valignatev

+0

Я думаю, для этого вам нужно будет создать пакетный исполняемый файл, для которого существуют различные инструменты. BTW, если у вас есть «devops people», и вы не можете просто развертывать себя, * это не devops *. – jonrsharpe

ответ

4

Есть несколько нюансов, чтобы как семечковые работы , К сожалению, использование --prefix vendor для хранения всех зависимостей проекта не работает, если какая-либо из этих зависимостей или зависимостей зависимостей установлена ​​в месте, где pip может их найти. Он пропустит эти зависимости и просто установит остальные в вашу папку vendor.

В прошлом я использовал параметр virtualenv --no-site-packages для решения этой проблемы. В одной компании мы отправили бы весь virtualenv, который включает двоичный код python. В интересах только отгрузки зависимостей вы можете комбинировать с помощью virtualenv с переключателем --prefix, чтобы обеспечить себе чистую среду, которая устанавливается в нужное место.

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

#!/bin/bash 

tempdir=$(mktemp -d -t project.XXX) # create a temporary directory 
trap "rm -rf $tempdir" EXIT   # ensure it is cleaned up 
# create the virtualenv and exclude packages outside of it 
virtualenv --python=$(which python2.7) --no-site-packages $tempdir/venv 
# activate the virtualenv 
source $tempdir/venv/bin/activate  
# install the dependencies as above 
pip install -r requirements.txt --prefix=vendor 
1

В большинстве случаев вы должны иметь возможность «продавать» все зависимости. Это в основном грубая версия virtualenv.

Например, посмотрите, как пакет requestsincludes chardet and urllib3 в своем собственном дереве источников. Вот пример сценария, который должен выполнить первоначальную загрузку и копирование: https://gist.github.com/proppy/1136723

После установки зависимостей вы можете ссылаться на них с помощью from .some.namespace import dependency_name, чтобы убедиться, что вы используете локальные версии.

0

Это можно сделать с последними версиями pip (я использую 8.1.2). На строительной машине:

pip install -r requirements.txt --prefix vendor 

Затем запустите его:

PYTHONPATH=vendor/lib/python2.7/site-packages python yourapp.py 

(Это в основном расширение @valentjedi комментарий Спасибо.!)

+0

Этот '-prefix vendor', похоже, не имеет ничего общего с добавлением имен поставщиков, это просто указывает папку для установки пакетов. – ThorSummoner

+0

Правильно, это просто имя папки для размещения зависимых поставщиков. –

 Смежные вопросы

  • Нет связанных вопросов^_^