从setup.py安装依赖项

adi*_*anp 18 python setuptools install-requires

我想知道是否和.deb包一样,在我的setup.py中可以配置我的包的依赖项,然后运行:

$ sudo python setup.py install
Run Code Online (Sandbox Code Playgroud)

它们是自动安装的.已经研究过互联网,但我发现只是让我困惑,像"需要","install_requires"和"requirements.txt"之类的东西

hay*_*ayj 19

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

gunicorn
docutils>=0.3
lxml==0.5a7
Run Code Online (Sandbox Code Playgroud)

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

import os
thelibFolder = os.path.dirname(os.path.realpath(__file__))
requirementPath = thelibFolder + '/requirements.txt'
install_requires = [] # Here we'll get: ["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, [...])
Run Code Online (Sandbox Code Playgroud)

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

在设置功能也必须设置versionpackagesauthor等,读取一个完整的例子DOC:https://docs.python.org/3/distutils/setupscript.html

您的包目录将如下所示:

??? mypackage
?   ??? mypackage
?   ?   ??? __init__.py
?   ?   ??? mymodule.py
?   ??? requirements.txt
?   ??? setup.py
Run Code Online (Sandbox Code Playgroud)

  • 或者你可以完全放弃 `requirements.txt` 文件并直接在你的 `setup(install_requires=['gunicorn', 'docutils>=0.3', 'lxml==0.5a7'], ...)`设置.py`。 (7认同)
  • `install_requires = list(f.read().splitlines())` 比在循环中一次添加一行简单得多。(`list` 调用可能是也可能不是必要的;测试并查看。) (5认同)
  • 我要补充一点,应该忽略注释和空格前缀 `install_requires = [line for line in map(str.lstrip, f.read().splitlines()) if len(line) > 0 而不是 line.startswith(' #')]` (2认同)

小智 6

您从 生成 Egg 信息setup.py,然后使用requirements.txt这些 Egg 信息中的 :

$ python setup.py egg_info
$ pip install -r <your_package_name>.egg-info/requires.txt 
Run Code Online (Sandbox Code Playgroud)


Zay*_*try 5

另一种可能的解决方案

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"))

Run Code Online (Sandbox Code Playgroud)

  • @muammar 它可能会失败,因为 pip 明确不应该以编程方式使用。看到“pip._internal.req”中的“_”了吗?这意味着它是包内部的一部分,不应该在外部使用,并且可能会在没有警告的情况下发生更改。绝对不能保证它不会突然改变,事实上它已经改变了。 (2认同)