#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]
.