Как выборочно установить пакет в одном проекте pypi, который имеет несколько пакетов?

#python #pip #setuptools #setup.py #pypi

#python #pip #setuptools #setup.py #pypi

Вопрос:

У меня следующая структура папок:

 .
├── demo
│   └── __init__.py
├── demo2
│   └── __init__.py
└── setup.py
 

demo/__init__.py:

 #!/usr/bin/env python
#-*- coding:utf-8 -*-
def test():
    print("demo1!")
if __name__ == '__main__':
    test()
 

demo2/__init__.py:

 #!/usr/bin/env python
#-*- coding:utf-8 -*-
def test():
    print("demo2!")
if __name__ == '__main__':
    test()
 

setup.py:

 from setuptools import setup, find_packages

setup(
    name="demo20210216",
    version="0.1.0",
    packages=find_packages(),
    entry_points={
        'console_scripts': [
            'demo = demo:test',
            'demo2 = demo2:test',
        ]
    }
)
 

Я использую next для загрузки в pypi:

 # python setup.py sdist bdist_wheel
# twine upload dist/*
 

Затем я мог бы использовать pip install demo20210216 для установки пакета и мог убедиться, что у меня есть два пакета demo и demo2 установлены, между тем скрипт demo и demo2 установлен в папке Scripts.

Проблема:

Все в порядке, просто для demo2 большинства моей аудитории это не нужно. Итак, я хочу найти способ: по умолчанию просто установить demo1 , но если пользователю нужно, он / она может использовать дополнительный способ установки demo2 , есть ли способ реализовать это в pip?

(PS: я не хочу разделять demo1 и demo2 использовать другой проект pypi)

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

1. Нет, нет. Пакеты PyPI являются атомарными и не могут быть разделены на части. Создайте другой пакет PyPI demo2 и объявите его необязательной зависимостью от demo1 , например pip install demo1[extras] , установит demo1 и demo2 .

2. @hoefling ДА, это обходное решение выглядит хорошо, по крайней мере, для аудитории, которая все еще работает над одним пакетом, даже если это не так. Итак, спасибо, если хотите, вы можете отправить это в качестве ответа, тогда я могу его принять.

Ответ №1:

Наконец, больше никаких решений не найдено, просто используйте решение в комментариях: то есть использование одного проекта-оболочки зависит от других проектов (demo1, demo2):

setup.py:

 from setuptools import setup, find_packages

setup(
    name="demowrapper",
    version="0.1.0",
    packages=find_packages(),

    extras_require={
        'demo1': ['demo1'],
        'demo2': ['demo2'],
    },
)
 

Тогда, по крайней мере, для пользователя, похоже, что он все еще может столкнуться с одним топовым проектом demowrapper и может выбрать компонент для установки pip install demowrapper[demo1] .