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

Это аналогичный вопрос Как я могу заставить setuptools установить пакет, который не находится в PyPI?, но не тот же.

Как я хотел бы использовать разветвленную версию некоторого пакета, setuptools игнорируют ссылку зависимости (так как она имеет тот же номер версии).

Есть ли способ принудительно использовать ссылку из dependency_links? Или это единственный способ изменить номер версии в forked repo?

requires = [
    ...
    'pyScss==1.1.3'
    ...

dependencies = [
    'https://github.com/nadavshatz/pyScss/zipball/master#egg=pyScss-1.1.3'
]

Обновление

Странно, видимо, он работает, если этот пакет является единственным в списке, который еще не установлен. Если есть другой недостающий пакет, он загрузит его из pypi.

Ответ 1

Я считаю, что вы можете просто использовать dependency_links, как описано в этом вопросе:

from setuptools import setup

setup(name = 'mypkg',
    version = '0.0.1',
    description = 'Foo',
    author = 'bar',
    author_email = '[email protected]',
      install_requires = ['pyScss==1.1.3'],
      dependency_links = [
      'https://github.com/nadavshatz/pyScss/zipball/master#egg=pyScss-1.1.3'
      ]
    )

Протестировано с помощью python setup.py develop

Вы, вероятно, захотите переименовать яйцо, чтобы подчеркнуть его fork http://www.python.org/dev/peps/pep-0386/

За пределами setup.py вы можете принудительно использовать это локально, используя requirements.txt и pip. Хотя это не сделает ваш пакет зависеть от вилки, вы можете легко документировать его как способ установки.

$ cat requirements.txt
https://github.com/nadavshatz/pyScss/zipball/master#egg=pyScss-1.1.3
$ pip install -r requirements.txt

Ответ 2

В итоге я сделал что-то очень похожее на ответ в fooobar.com/info/53157/....

Мне нужен пакет requests-file github, который конфликтует с конфликтом с другим пакетом requests-file в PyPi. Оба они имеют версию 1.0, а версия PyPi имеет несколько более высоких версий.

Обходной путь в моем ias_tools/setup.py выглядит следующим образом:

setup(
    ...
    install_requires=[
        'requests-file<=99.99',
    ],
    dependency_links=[
        'https://github.com/jvantuyl/requests-file/archive/b0a7b34af6e287e07a96bc7e89bac3bc855323ae.zip#egg=requests-file-99.99'
    ]
)

В моем случае я использую pip, поэтому мне также пришлось использовать --process-dependency-links:

% pip install --process-dependency-links ./ias_tools
You are using pip version 6.0.6, however version 6.1.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
Processing ./ias_tools
  DEPRECATION: Dependency Links processing has been deprecated and will be removed in a future release.
Collecting requests-file<=99.99 (from ias-tools==0.1)
  Downloading https://github.com/jvantuyl/requests-file/archive/b0a7b34af6e287e07a96bc7e89bac3bc855323ae.zip
Requirement already satisfied (use --upgrade to upgrade): requests>=1.1.0 in ./venv/lib/python2.7/site-packages (from requests-file<=99.99->ias-tools==0.1)
Installing collected packages: ias-tools, requests-file
  Running setup.py install for ias-tools
  Running setup.py install for requests-file
Successfully installed ias-tools-0.1 requests-file-1.0

Я не слишком беспокоюсь об уведомлении об устаревании, так как запрос на перенос был отправлен в pip для обесценения устаревания (после обсуждение об этом).