繁体   English   中英

从 setup.py 安装依赖项

[英]Install dependencies from setup.py

我想知道是否还有 .deb 包,例如,是否可以在我的 setup.py 中为我的 package 配置依赖项,然后运行:

$ sudo python setup.py install

它们是自动安装的。 已经研究过互联网,但我发现的一切都让我感到困惑,比如“requires”、“install_requires”和“requirements.txt”

只需在您的 lib 文件夹中创建requirements.txt并添加所有依赖项,如下所示:

gunicorn
docutils>=0.3
lxml==0.5a7

然后创建一个setup.py脚本并读取requirements.txt

import os
lib_folder = os.path.dirname(os.path.realpath(__file__))
requirement_path = lib_folder + '/requirements.txt'
install_requires = [] # Here we'll get: ["gunicorn", "docutils>=0.3", "lxml==0.5a7"]
if os.path.isfile(requirement_path):
    with open(requirement_path) as f:
        install_requires = f.read().splitlines()
setup(name="mypackage", install_requires=install_requires, [...])

执行python setup.py install将安装你的包和所有依赖项。 就像@jwodder 说的,创建requirements.txt文件不是强制性的,你可以直接在setup.py脚本中设置install_requires 但编写requirements.txt文件是最佳实践。

setup函数调用中,您还必须设置versionpackagesauthor等,阅读文档以获取完整示例: https ://docs.python.org/3/distutils/setupscript.html

您的包目录将如下所示:

├── mypackage
│   ├── mypackage
│   │   ├── __init__.py
│   │   └── mymodule.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+ 中,可以使用来自pathlibPath class 来有效地做与@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(),
    ...
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM