Установить зависимости из setup.py
Интересно, возможно ли, например, для пакетов.deb, в моем файле setup.py я настраиваю зависимости для своего пакета и запускаю:
$ sudo python setup.py install
Они устанавливаются автоматически. Уже исследовал интернет, но все, что я обнаружил, просто оставило меня в замешательстве, такие вещи, как "require", "install_requires" и "needs.txt"
4 ответа
Просто создать requirements.txt
в вашей папке lib и напишите все зависимости следующим образом:
gunicorn
docutils>=0.3
lxml==0.5a7
Затем создайте setup.py
сценарий и читать requirements.txt
в:
import os
thelibFolder = os.path.dirname(os.path.realpath(__file__))
requirementPath = thelibFolder + '/requirements.txt'
install_requires = [] # Examples: ["gunicorn", "docutils>=0.3", "lxml==0.5a7"]
if os.path.isfile(requirementPath):
with open(requirementPath) as f:
install_requires = f.read().splitlines()
setup(name="yourpackage", install_requires=install_requires, [...])
Исполнение python setup.py install
установит ваш пакет и все зависимости. Как сказал @jwodder, не обязательно создавать requirements.txt
файл, вы можете просто установить install_requires
прямо в setup.py
скрипт. Но написание requirements.txt
файл является хорошей практикой.
В функции настройки вы также должны установить version
, packages
, author
и т. д., прочитайте документ для полного примера: https://docs.python.org/3.7/distutils/setupscript.html
Ваш пакет dir будет выглядеть так:
├── yourpackage
│ ├── yourpackage
│ │ ├── __init__.py
│ │ └── yourmodule.py
│ ├── requirements.txt
│ └── setup.py
Другое возможное решение
try:
# for pip >= 10
from pip._internal.req import parse_requirements
except ImportError:
# for pip <= 9.0.3
from pip.req import parse_requirements
def load_requirements(fname):
reqs = parse_requirements(fname, session="test")
return [str(ir.req) for ir in reqs]
setup(name="yourpackage", install_requires=load_requirements("requirements.txt"))
Вы генерируете информацию о яйце из вашегоsetup.py
, то вы используетеrequirements.txt
из этой информации о яйце:
$ python setup.py egg_info
$ pip install -r <your_package_name>.egg-info/requires.txt
В Python 3.4+ можно использоватьPath
класс изpathlib
, чтобы эффективно делать то же самое, что и ответ @hayj.
from pathlib import Path
import setuptools
...
def get_install_requires() -> List[str]:
"""Returns requirements.txt parsed to a list"""
fname = Path(__file__).parent / 'requirements.txt'
targets = []
if fname.exists():
with open(fname, 'r') as f:
targets = f.read().splitlines()
return targets
...
setuptools.setup(
...
install_requires=get_install_requires(),
...
)