pip игнорирует зависимости-ссылки в setup.py

У меня есть зависимости_ ссылки в моем setup.py:

...
dependency_links = ['http://github.com/robot-republic/python-s3/tarball/master.tar.gz#egg=python-s3'],
...

Но это не работает. Однако install_requires работает отлично. Может быть, есть другой способ настроить git repo, как это требуется для setup.py?

6 ответов

Решение

Этот ответ должен помочь. В двух словах, вам нужно указать версию (или "dev") для #egg=python-s3 так выглядит #egg=python-s3-1.0.0,

Обновления на основе комментария @Cerin:

  • В Pip 1.5.x есть флаг для включения обработки зависимых ссылок: --process-dependency-links, Я не проверял это, потому что я согласен с пунктом ниже.
  • Это обсуждение указывает на то, что использование зависимых ссылок для pip - плохая практика. Хотя эта функция была зачислена для устаревания, это больше не так. Есть действительный вариант использования для частных пакетов.

Начиная с версии 18.1 PIP URL поддерживается. Это означает, что вам больше не нужны устаревшие зависимости-ссылки. Вместо этого вы записываете зависимость прямо в список install_requires. Пример из @Chad выглядит так:

setup(
    name='yourpackage',
    version='1.7.5',
    packages=[],
    url='',
    license='',
    author='',
    author_email='',
    description='',
    install_requires=[
        'somepackage==1.2.0',
        'repo==1.0.0 @ https://github.com/user/archive/master.zip#egg=repo-1.0.0',
        'anotherpackage==4.2.1'
    ],
)

Для установки вашего пакета вы можете просто написать:

pip install yourpackage

(без --process-dependency-links)

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

У меня есть пакет на GitHub (не зарегистрированный в pypi), который опирается на другие пакеты GitHub (не-pypi). Я потратил слишком много времени, пытаясь понять, как получить пипс, чтобы справиться с этим правильно. Я включу то, что я сделал, чтобы исправить это здесь.

Помещение зависимостей в файл require.txt является предпочтительным методом перечисления зависимостей. Однако вам также необходимо заполнить install_requires в настройках. Именно на этом этапе я столкнулся с препятствием на пути pip, не желая устанавливать зависимости от GitHub.

В большинстве мест, в том числе в ответах на этот вопрос, указывается заполнить раздел зависимостей_установки. Однако вам также необходимо заполнить поле install_requires именем пакета, на который есть ссылка в dependency_links.

Например, если ваш файл require.txt содержит следующее.

somepackage==1.2.0
https://github.com/user/repo/tarball/master#egg=repo-1.0.0
anotherpackage==4.2.1

Тогда ваш установочный вызов должен выглядеть так:

setup(
    name='yourpackage',
    version='1.7.5',
    packages=[],
    url='',
    license='',
    author='',
    author_email='',
    description='',
    install_requires=[
        'somepackage==1.2.0',
        'repo==1.0.0',
        'anotherpackage==4.2.1'
    ],
    dependency_links=[
        'https://github.com/user/repo/tarball/master#egg=repo-1.0.0'
    ]
)

Хорошо, теперь мы настроили наш пакет; установка это следующая задача. Это где я провел много времени. Я не мог понять, почему указание зависимых_ссылок, очевидно, ничего не сделало. Хитрость заключается в том, что в некоторых случаях вам нужно установить флаг разрешить все внешние (может быть более конкретным) для pip. Например:

pip install git+https://github.com/user/anotherrepo.git
--process-dependency-links --allow-all-external

Вы сделали, и это работает!

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: связи с зависимостями и флаги "процесс-зависимости-ссылки" и "allow-all-external" устарели, поэтому они скоро будут удалены. В течение времени, которое я потратил, я не мог найти лучший, предпочтительный метод и все еще имел функцию пипса должным образом.

Несколько замечаний по некоторым вопросам, которые я обнаружил, в частности, по установке из частных репозиториев.

Установка из pip & setuptools имеет некоторые тонкие различия; но этот способ должен работать для обоих.

from setuptools import setup
import os
# get deploy key from https://help.github.com/articles/git-automation-with-oauth-tokens/
github_token = os.environ['GITHUB_TOKEN']

setup(
    # ...
    install_requires='package',
    dependency_links = [
    'git+https://{github_token}@github.com/user/{package}.git/@{version}#egg={package}-0'
        .format(github_token=github_token, package=package, version=master)
        ]

Пара замечаний здесь:

  • Для частных репозиториев вам необходимо пройти аутентификацию с GitHub; Самый простой способ, который я нашел, - это создать токен oauth, перенести его в свою среду и затем включить в URL.
  • Вам нужно указать номер версии (здесь 0) в конце ссылки, даже если в PyPI нет пакета. Это должно быть реальное число, а не слово.
  • Вам нужно предисловие с git+ сказать setuptools это клонировать репозиторий, а не указывать на zip / tarball
  • version может быть веткой, тегом или хэшем коммита
  • Вам нужно поставить --process-dependency-links при установке из пипса

First upgrade your pip version as this is a new syntax.

pip install pip --upgrade

Then do the following:

install_requires=[
    'bleualign-git @ https://github.com/rsennrich/Bleualign/archive/<commit-hash or branch-name>.zip#egg=bleualign-git-1.0.0'
]
  • Version 1.0.0 and name "bluealign-git" are randomly chosen.
  • The version number is necessary.
  • We advisedly used the name "bleualign-git" to distinguish it from the main repository version.

Hope this helps.

Comments:

Good answer (upvoted). Also want to mention that the actual result would likely depend on the platform and/or pip version, though. I've seen when it works, or seemingly works but did not really pull the dependency from the specified link, or simply being rejected. So I would probably just use this as a short time workaround only. Stick with the mainstream way whenever possible.

Ни одно из приведенных выше решений не сработало для меня в соответствующих явных формах. Я добавляю это как еще одно решение для определенных конкретных случаев. У OP есть архив в их удаленном репо, но я оказался здесь по связанному с этим случаю: только исходный код в удаленном репо.

У меня есть зависимость, которая представляет собой удаленный частный репозиторий в Azure DevOps. я хотел бы использовать для установки локального пакета Python, а также для автоматической установки удаленной зависимости. Удаленный репозиторий представляет собой пакет Python с некоторым исходным кодом. В репо нет артефактов сборки, таких как яйца/колеса/tarballs, просто файлы. Я могу вручную установить удаленную зависимость с помощью , следовательно, я правильно подозревал, что удаленный репозиторий не должен содержать яйца/колеса/tarballs.

Вот соответствующая строка моего файл

      setup.py

...

install_requires=["packagename @ git+https://dev.azure.com/.../_git/packagename"]
Другие вопросы по тегам