Python 从setup.py安装依赖项

Python 从setup.py安装依赖项,python,setuptools,install-requires,Python,Setuptools,Install Requires,我想知道是否可以在my setup.py中配置包的依赖项,并运行以下程序,例如.deb包: $ sudo python setup.py install 它们是自动安装的。已经研究过互联网,但我发现的一切让我感到困惑,像“requires”、“install_requires”和“requirements.txt”之类的东西只需在lib文件夹中创建requirements.txt,并添加所有依赖项,如下所示: gunicorn docutils>=0.3 lxml==0.5a7 ├──

我想知道是否可以在my setup.py中配置包的依赖项,并运行以下程序,例如.deb包:

$ sudo python setup.py install

它们是自动安装的。已经研究过互联网,但我发现的一切让我感到困惑,像“requires”、“install_requires”和“requirements.txt”之类的东西只需在lib文件夹中创建
requirements.txt
,并添加所有依赖项,如下所示:

gunicorn
docutils>=0.3
lxml==0.5a7
├── mypackage
│   ├── mypackage
│   │   ├── __init__.py
│   │   └── mymodule.py
│   ├── requirements.txt
│   └── setup.py
然后创建一个
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, [...])
执行
python setup.py install
将安装您的软件包和所有依赖项。正如@jwodder所说,创建
requirements.txt
文件不是强制性的,您可以直接在
setup.py
脚本中设置
install\u requires
。但是编写
requirements.txt
文件是最佳实践

在设置功能中,您还必须设置
版本
软件包
作者
等,请阅读文档以获取完整示例:

您的包目录将如下所示:

gunicorn
docutils>=0.3
lxml==0.5a7
├── mypackage
│   ├── mypackage
│   │   ├── __init__.py
│   │   └── mymodule.py
│   ├── requirements.txt
│   └── setup.py

另一种可能的解决办法

试试看:
#对于pip>=10
从pip.\u internal.req导入解析\u需求
除恐怖外:

#对于pip
install\u requires=list(f.read().splitlines())
比在循环中每次追加一行要简单得多。(调用
list
可能是必要的,也可能不是必要的;测试并查看。)或者类似于
[f.read()中的行对行分割行(),如果len(line)>0]
以防止空白行,或者您可以完全放弃
requirements.txt
文件并编写
安装程序(安装需要=['gunicorn','docutils>=0.3',lxml==0.5a7'],…)
直接在
setup.py
中。我要补充的是,如果len(line)>0而不是line.startswith('.#'),则应该忽略注释和空格前缀
install_requires=[line for line in map(str.lstrip,f.read().splitlines())]
这将连接到internet并安装所有依赖项,对吗?如何指示它从本地回购协议安装?只需执行
pip安装mypacke.whl--无索引--查找deps_文件夹的链接
就可以了吗?这对我很有效。但是,不知道这在将来会如何失败(如果失败的话)。@muammar它可能会失败,因为pip显然不应该以编程方式使用。请参阅
pip.\u internal.req
中的
?这意味着它是软件包内部的一部分,不应该在外部使用,可能会在没有警告的情况下更改。绝对不能保证它不会突然改变,事实上它已经改变了