Как я могу заставить setuptools установить пакет, который не на PyPI?

142

Я только начал работать с setuptools и virtualenv. Для моего пакета требуется последняя версия python-gearman, доступная только на GitHub. Версия python-gearman, находящаяся на PyPI, старая. Исходный код Github совместим с setuptools, то есть имеет setup.py и т. Д. Есть ли способ заставить setuptools загрузить и установить новую версию вместо того, чтобы искать ее в PyPI и устанавливать старую?

К вашему сведению, новый питон-снайпер http://github.com/mtai/python-gearman

андрей
источник
1
Есть ли причина, по которой вы пытаетесь установить пакет python непосредственно из Git вместо того, чтобы загружать исходный код и использовать его python setup.py installв каталоге с исходным кодом?
Андрей
4
Я хочу, чтобы мой пакет был развернут на нескольких машинах и все его зависимости установлены автоматически.
Андрей
2
Вы можете использовать easy_installили pipустановить его прямо с Github. Но есть и другое решение: рассматривали ли вы возможность добавления пакета в PyPI?
Вольф
2
Так как это просто для развертывания, почему бы не использовать buildout? У него есть пара готовых плагинов Git.
Вольф
решение здесь: stackoverflow.com/a/17442663/1841871
zazabe

Ответы:

156

Ключ должен сказать easy_install, где пакет может быть загружен. В данном конкретном случае его можно найти по адресу http://github.com/mtai/python-gearman/tarball/master . Однако эта ссылка сама по себе не сработает, потому что easy_install не может сказать, просто посмотрев на URL, что она собирается получить.

Вместо этого, изменив его на http://github.com/mtai/python-gearman/tarball/master#egg=gearman-2.0.0beta , easy_install сможет определить имя пакета и его версию.

Последний шаг заключается в добавлении URL-адреса в зависимости вашего пакета, например:

setup(
   ...
   dependency_links = ['http://github.com/mtai/python-gearman/tarball/master#egg=gearman-2.0.0beta']
)

Теперь, когда ВАШ пакет устанавливается, easy_install обнаружит, что есть «gearman 2.0.0beta», доступный для загрузки по этому URL, и с радостью выберет его поверх того, что есть в PyPI, если вы укажете «gearman> = 2.0.0beta» в ваших зависимостях ..

(Обычно способ такого рода действия заключается в том, чтобы включить ссылку на странице PyPI на загружаемый источник; в этом случае, если автор пакета gearman включил ссылку, подобную приведенной выше, вы уже настроены Как правило, люди помечают версию для разработки как «myproject-dev», а затем люди используют требование «myproject> = somever, == dev», так что, если пакет не имеет чего-либо или выше, easy_install попытается проверить или скачать релиз.)

Вам нужно будет указать --process-dependency-linksпри использовании pip. Обратите внимание, что обработка ссылок зависимостей устарела и будет удалена в следующем выпуске.

Пи Джей Эби
источник
1
Я сделал то, что вы предложили, но когда я запускаю «python setup.py development», он говорит «запись зависимостей_ссылок в foo.egg-info / dependency_links.txt», но фактически не загружает и не устанавливает пакет. Я использую virtualenv на основе setuptools, если это поможет.
Андрей
15
Вам также необходимо установить install_requires = 'gearman> = 2.0.0beta'; ты включил это?
PJ Eby
3
Это не работает для меня, с betaсуффиксом в существующей версии PyPI, он все равно будет устанавливать пакет из PyPI вместо того, который определен в dependency_links. Если вы попытаетесь установить более высокую версию, чем #egg=package-versionта, которая существует в PyPI , инструмент установки выдаст сообщение Could not find a version that satisfies the requirementоб ошибке и список всех версий, доступных в PyPI. Обратите внимание, что я пытаюсь собрать свой пакет с помощью sdist, а затем установить его с помощью pip install http://url/to/my/generated/tar.
Зазабе
1
хорошо, установив мой пакет с easy_install http://url/to/my/generated/tar, все работает как ожидалось ... Есть идеи, почему?
Зазабе
3
--process-dependency-linksбыл удален с pip19! См. Github.com/pypa/pip/issues/6162
Феникс,
67

Вы можете использовать pip install protocol+location[@tag][#egg=Dependency]формат для установки напрямую из исходного кода с помощью pip.

Гит

pip install git+https://github.com/username/repo.git
pip install git+https://github.com/username/repo.git@MyTag
pip install git+https://github.com/username/repo.git@MyTag#egg=ProjectName

ртутный

pip install hg+https://hg.myproject.org/MyProject/

SVN

pip install svn+svn://svn.myproject.org/svn/MyProject

Bzr

pip install bzr+http://bzr.myproject.org/MyProject/trunk

Поддерживаются следующие протоколы: [+git, +svn, +hg, +bzr]

Версии

@tag позволяет указать конкретную версию / тег для проверки.

#egg=name позволяет указать, что проект является зависимостью для других.

Порядок должен быть всегда @tag#egg=name.

Частные хранилища

Вы также можете установить из частных репозиториев, изменив протокол на SSH ( ssh://) и добавив соответствующего пользователя ( git@):

git+ssh://git@github.com/username/my_private_repo

Вы также можете установить из частных репозиториев с именем пользователя / паролем.

git+https://<username>:<password>@github.com/<user>/<repo>.git

Github предоставляет возможность создавать персональные токены OAuth, которые можно циклически повторять.

git+https://<oauth token>:x-oauth-basic@github.com/<user>/<repo>.git

requirements.txt

requirements.txt используется для указания зависимостей проекта:

requirements.txt

package1
package2==1.0.2
package3>=0.0.4
git+https://github.com/username/repo.git

Они не устанавливаются автоматически с пакетом и должны быть установлены с помощью команды pip -r requirements.txt.

Включая файлы требований

Файлы требований могут включать другие файлы требований:

Требования-Docs.txt

sphinx
-r requirements-dev.txt

Требования-dev.txt

some-dev-tool
-r requirements.txt

requirements.txt

package1
package2==1.0.2
package3>=0.0.4
git+https://github.com/username/repo.git

setup.py

Файлы требований могут устанавливать зависимости, указанные в setup.pyследующей команде:

-e .

setup.pyМожно также установить из репозиториев, используя тот же синтаксис, что и выше, но используя dependency_linksзначение, указанное в этом ответе .

Ссылки:

https://pip.pypa.io/en/latest/user_guide.html#install-packages https://pip.pypa.io/en/latest/reference/pip_install.html

РЭП
источник
2
setup.py МОЖЕТ установить из репозиториев. Просто найдите «setup.py dependency_links»
TomDotTom
1
@ TomDotTom Сумасшедший, я даже проголосовал против этого ответа, но почему-то не усвоил его = P Я обновлю свой ответ. Спасибо что подметил это! Это поможет с некоторыми вещами, которые я делаю.
Ребс
Однако, я думаю, что зависимость от зависимостей (?) github.com/pypa/pip/issues/3939 снижается . Мне нравится этот ответ, и я думаю, что он лучше благодаря способности (в файле setup.py):extras_require={'all': [repo @ git+https://github.com/username/repo.git]}
Джозия Л.
21

Как я должен был сделать то же самое, я нашел еще один способ сделать это как pip«s --process-dependency-linksпланируется снять в pip19,0 в соответствии с этим комментарием .

pip 18.1 включает в себя следующую функцию

Разрешить использование URL-требований PEP 508 в качестве зависимостей.

Из описания PEP 508 синтаксис для таких зависимостей URL выглядит следующим образом:

Минимальный поиск на основе URL:

pip @ https://github.com/pypa/pip/archive/1.3.1.zip#sha1=da9234ee9982d4bbb3c72346a6de940a148ea686

Так по вашему setup.pyэто будет выглядеть

setup(
   ...
   install_requires = [
   ...
   'python-gearman @ https://github.com/mtai/python-gearman/archive/master.zip'
   ...
   ]
)

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

Насколько мне известно, самый простой способ обновить зависимость - это использовать pip install -I .при установке вашего пакета из его каталога.

Фил
источник
pip installПоддерживает ли это также все, что поддерживает, например, git-URL и #subdirectory=...т. Д.? Или они придумали новый синтаксис с различными функциями, представленными другим и несовместимым способом?
Ремрам
Если вы не используете setuptools и не управляете зависимостями вручную в командной строке, похоже, вам все равно придется использовать подход, описанный в ответе @Rebs .
Фил
1
Просто, чтобы подтвердить это работает с distutils.core.setupиpip 19.1.1
увидеть
Результирующий requirements.txt, однако, не совместим сpip install -r requirments.txt
увидеть
@shouldsee, о чем requirments.txtты говоришь?
Фил
6

Vanilla setuptoolsне поддерживает загрузку напрямую из репозитория git, но вы можете использовать одну из ссылок на источник загрузки с этой страницы, например:

easy_install http://github.com/mtai/python-gearman/tarball/master
Нед Дейли
источник
Итак, чтобы убедиться, что эта версия python-gearman установлена ​​на любом сервере, где будет находиться мой пакет, мне придется вручную запустить easy_install перед установкой моего пакета?
Андрей
Если вы используете easy_install, да. Но, как уже отмечали другие, вы можете перейти к pipили buildoutс более сложным управлением требованиями. См., Например: pip.openplans.org/#requirements-files
Нед Дейли,
На самом деле вам не нужно вручную запускать easy_install; Вы можете просто добавить дополнительную ссылку в ваш setup.py. Я напишу ответ с объяснением деталей.
PJ Eby
2
Как упомянуто в моем комментарии выше, setup.py предоставляет зависимости-ссылки, которые позволяют вам загружать из репозитория
gti