我有一个与Travis CI一起使用的requirements.txt
文件。复制requirements.txt
和setup.py
中的需求似乎很愚蠢,因此我希望将文件句柄传递给setuptools.setup
中的install_requires
kwarg。
这可能吗?如果是,我该怎么做呢?
这是我的requirements.txt
文件:
guessit>=0.5.2
tvdb_api>=1.8.2
hachoir-metadata>=1.3.3
hachoir-core>=1.3.3
hachoir-parser>=1.3.4
它不能接受文件句柄。参数
install_requires
可以only be a string or a list of strings。当然,您可以读取安装脚本中的文件,并将其作为字符串列表传递给
install_requires
。您可以将其翻转过来,在
setup.py
中列出依赖项,而在requirements.txt
中使用一个字符-一个点.
。或者,即使没有建议,也可以使用以下黑客(使用
pip 9.0.1
测试)解析requirements.txt
文件(如果它没有通过URL引用任何外部需求):但这不会过滤environment markers。
在pip的旧版本中,更具体地说是older than 6.0,有一个公共API可以用来实现这一点。需求文件可以包含注释(
#
),也可以包含其他一些文件(--requirement
或-r
)。因此,如果您真的想解析一个requirements.txt
,可以使用pip解析器:表面上看,似乎
requirements.txt
和setup.py
是愚蠢的重复,但重要的是要理解,虽然形式相似,但预期的功能却截然不同。当指定依赖项时,包作者的目标是说“无论您在何处安装此包,这些都是您需要的其他包,以便此包正常工作。”
相反,部署作者(在不同的时间可能是同一个人)有不同的工作,他们说“这里是我们收集和测试的包列表,我现在需要安装”。
软件包作者为各种各样的场景编写代码,因为他们把他们的工作放在那里,以他们可能不知道的方式使用,并且无法知道哪些软件包将与他们的软件包一起安装。为了成为一个好邻居并避免依赖版本与其他包冲突,它们需要指定尽可能多的依赖版本。这就是
install_requires
中的setup.py
所做的。部署作者为一个非常不同、非常具体的目标编写:安装在特定计算机上的已安装应用程序或服务的单个实例。为了精确控制部署,并确保测试和部署了正确的包,部署作者必须指定要安装的每个包的确切版本和源位置,包括依赖项和依赖项的依赖项。有了这个规范,一个部署可以重复地应用到多台机器上,或者在一台测试机器上测试,并且部署作者可以确信每次都部署相同的包。这就是
requirements.txt
所做的。所以你可以看到,虽然它们看起来都是一个很大的包和版本列表,但这两个东西有着非常不同的工作。而且很容易把它弄错!但是正确的思考方式是
requirements.txt
是对所有不同setup.py
包文件中的需求所提出的“问题”的“答案”。与其手动编写,它通常是通过告诉pip查看一组所需包中的所有setup.py
文件,找到一组它认为符合所有要求的包,然后在安装后,将该包列表“冻结”到一个文本文件中(这是pip freeze
名称的来源)。所以外卖:
setup.py
应该声明仍然可行的最宽松的依赖关系版本。它的工作是说明一个特定的包可以使用什么。requirements.txt
是定义整个安装作业的部署清单,不应将其视为绑定到任何一个包。它的工作是声明使部署工作所需的所有包的详尽列表。参考文献:
相关问题 更多 >
编程相关推荐