我正在使用
install_requires = [str(ir.req) for ir in parse_requirements("requirements.txt", session=PipSession())]
pip install .
。但是,这似乎不适用于看起来像这样的requirements.txt:
--trusted-host blah
--extra-index-url blah2
...
(在pip8.0.0中添加了对--trusted-host的支持)。从blah安装失败,因为它抱怨它不是一个不受信任的主机,好像它从未处理过第一行。
但是,pip install -r requirements.txt
完美无缺,所以这些选项都是正确的。
这意味着parse_requirements
没有做什么。 我的问题是:如何仅使用pip install .
修复或解决此问题?我可以做一些可怕的事情:
os.system(pip install -r requirements.txt)
setup(...
setup.py文件中的。
requirements.txt和setup.py的隐式耦合让我很困惑。 setup中没有任何内容调用requirements.txt,除非您自己显式解析requirements.txt,但requirements.txt是一个非常标准的python约定。
编辑:我们正在使用执行pip install .
的工具(Cloudify,有时是Chef)。我们无法改变这一点。我必须使用--trusted-host和--extra-index-urls而不使用pip.conf来实现这个可用包。目前我们正在做os.system技巧。
答案 0 :(得分:5)
有很多关于使用setup.py vrs的文章。 requirements.txt。 Setup.py适用于抽象需求。 Requirements.txt用于具体要求。换句话说,它们用于不同的目的。而requirements.txt适用于环境,而setup.py适用于包。因此,setup.py从requires.txt中读取它是没有意义的,就像从一个厨师食谱中读取deb包一样没有意义。 Abstract vrs. Concrete Requirements
人们这样做的原因通常是他们希望支持人们在结账时使用add_subdirectory(opencv-3.1.0)
target_link_libraries(foo opencv-core)
安装他们的软件包,而无需两次列出他们的依赖项。这是一个合理的事情,这就是为什么需求文件格式有一个启用它的构造,只需创建一个包含"。"的requirements.txt文件。或" -e。"和pip将自动安装项目及其所有依赖项。
编辑:
由于pip不是库,因此使用程序中暴露最多的部分是最安全的(在我看来)。 pip install -r requirements.txt
的替代方案是
os.system
答案 1 :(得分:2)
This answer from goCards完全有效,如果无法绕过pip install .
,您应该从setup.py导入pip。但我想解释一下这里到底发生了什么。这是你需要知道的:
install_requires
是一个仅由setuptools支持的选项,这是一个第三方软件包,它改进了distutils
(setup.py文件中使用的标准工具,并随Python一起分发)。install_requires
,因此--trusted-host
等选项无法发送到install_requires
。parse_requirements("requirements.txt", session=PipSession())
的原因。此函数仅生成包。不会返回--trusted-host bla
等选项行,但如果您向PackageFinder
提供了parse_requirements
,则会将其发送给git "/tmp/node_exporter" do
repository 'https://github.com/prometheus/node_exporter.git'
revision 'master'
action :sync
end
。但是你不希望返回这些选项,因为setuptools不知道这些选项是什么!长话短说,如果你想使用pip选项,你需要使用pip。