Установить зависимости из 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(),
    ...
)
Другие вопросы по тегам