Не удается установить подпакет пространства имен Python в зависимости от другого подпакета

1

Моя цель - создать пакет пространства имен с двумя подпакетами: foo и bar (в зависимости от foo), а затем перетащить пакет пространства имен в репозиторий git (без публикации его в PyPI), чтобы я мог установить либо подпакет, либо репо url.

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

root/
 ├ setup.py
 └ microlibs/
    ├ foo/
    │  ├ setup.py
    │  ├ macrolib/
    │     └ foo/
    │        ├ __init__.py
    │        ├ module1.py
    │        ├ ...
    │        └ moduleN.py
    .
    .
    .
    └ bar/
       ├ setup.py
       ├ macrolib/
          └ bar/
             ├ __init__.py
             ├ module1.py
             ├ ...
             └ moduleN.py

Файл setup.py foo не имеет зависимостей:

Foo/setup.py

from setuptools import setup
microlib_name = 'macrolib.foo'
setup(
    name=microlib_name,
    version="0.1.0",
    namespace_packages=['macrolib'],
    packages=[microlib_name],
    install_requires=[]
)

Поскольку зависимости баров включают foo, setup.py панели включает macrolib.bar в списке install_requires:

бар /setup.py

from setuptools import setup
microlib_name = 'macrolib.bar'
setup(
    name=microlib_name,
    version="0.1.0",
    namespace_packages=['macrolib'],
    packages=[microlib_name],
    install_requires=[
        'macrolib.foo'
    ]
)

После нажатия на реплику bitbucket я могу без проблем установить macrolib.foo с подкаталогом репо.

$ pip install git+http://path/to/repo.git@<branch name>#"subdirectory=foo&egg=macrolib.foo"

С установленным macrolib.foo я также могу установить macrolib.bar без проблем в подкаталог репо.

$ pip install git+http://path/to/repo.git@<branch name>#"subdirectory=bar&egg=macrolib.bar"

Однако, если я попытаюсь установить macrolib.bar без установки macrolib.foo, то установка завершилась неудачно.

$ pip install git+http://path/to/repo.git@<branch name>#"subdirectory=bar&egg=macrolib.bar"

ошибка:

Collecting macrolib.foo (from macrolib.bar==0.1.0)
  Could not find a version that satisfies the requirement macrolib.foo (from macrolib.bar==0.1.0) (from versions: )
No matching distribution found for macrolib.foo (from macrolib.bar==0.1.0)

Я предполагаю, что это из-за отсутствия ссылок dependency_links в bar/setup.py. Поэтому я пробовал разные комбинации URL-адресов ссылок, все с ошибкой с той же ошибкой.

Форматы, которые я пробовал:

dependency_links=['http://path/to/repo.git@<branch name>#"subdirectory=foo&egg=macrolib.foo"']

dependency_links=['http://path/to/repo.git@<branch name>#subdirectory=foo&egg=macrolib.foo']

dependency_links=['http://path/to/repo/tarball/<branch name>#"subdirectory=foo&egg=macrolib.foo"']

dependency_links=['http://path/to/repo/tarball/<branch name>#subdirectory=foo&egg=macrolib.foo']

dependency_links=['http://path/to/repo/archive/<branch name>.zip#"subdirectory=foo&egg=macrolib.foo"']

dependency_links=['http://path/to/repo/archive/<branch name>.zip#subdirectory=foo&egg=macrolib.foo']

ИЛИ добавьте префикс 'git+' ко всем указанным выше адресам.

Мой вопрос в том, каков правильный формат url для dependency_links, чтобы установить macrolib.foo как зависимость, или есть ли другие способы заставить его работать?

Теги:
pip
setuptools

1 ответ

1
Лучший ответ

Это правильный формат (добавление "git+" и версия зависимостей):

dependency_links=['git+http://path/to/repo.git@<branch name>#subdirectory=foo&egg=macrolib.foo-0.1.0']

и вы должны спросить pip обработать его:

pip install --process-dependency-links git+http://path/to/repo.git@<branch name>#"subdirectory=bar&egg=macrolib.bar"
  • 0
    Благодарю. Добавление --process-dependency-links действительно делает шаг на шаг ближе к решению, но все равно вызывает ту же ошибку из-за нераспознанного формата ссылок. Я только что понял, что добавление git+ и «версии зависимостей» делает это правильным. Я немного отредактировал ответ, чтобы его можно было принять.
  • 0
    У меня все еще есть вопрос. Я вижу много других, использующих tarball / <имя ветви> в качестве ссылки для зависимости, например, этот . Почему ссылка .git тоже работает?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню