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

Pip игнорирует dependency_links в setup.py

У меня есть dependency_links в моей setup.py:

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

Но это не сработает. Однако install_requires работает нормально. Возможно, существует еще один способ настройки git repo, как требуется для setup.py?

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

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

Например, если ваш файл требований .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'
    ]
)

Итак, теперь у нас настроен наш пакет; установка это следующая задача. Здесь я провел много времени. Я не мог понять, почему указание dependency_links, по-видимому, ничего не делало. Фокус в том, что в некоторых случаях вам нужно установить флажок allow-all-external (может быть более конкретный) для pip. Например:

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

Вы закончили, и он работает!

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

Ответ 3

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

Установка из 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, если установить из pip

Ответ 4

начиная с версии 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)

Ответ 5

Сначала обновите свою версию pip, так как это новый синтаксис.

pip install pip --upgrade

Затем сделайте следующее:

install_requires=[
    'bleualign-git @ https://github.com/rsennrich/Bleualign/archive/<commit-hash or branch-name>.zip#egg=bleualign-git-1.0.0'
]
  • Версия 1.0.0 и имя "bluealign-git" выбираются случайным образом.
  • Номер версии необходим.
  • Мы сознательно использовали имя "bleualign-git", чтобы отличить его от основной версии репозитория.

Надеюсь это поможет.

Комментарии:

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