有没有办法为基于平台的 Python 应用程序提供条件 requirements.txt 文件?
Posted
技术标签:
【中文标题】有没有办法为基于平台的 Python 应用程序提供条件 requirements.txt 文件?【英文标题】:Is there a way to have a conditional requirements.txt file for my Python application based on platform? 【发布时间】:2015-05-27 03:39:40 【问题描述】:我编写了一个 Python 应用程序,它与 Linux 和 Windows 平台都兼容。但是有一个问题......我需要用于 Windows 的 python 包之一与 Linux 不兼容。幸运的是,还有另一个包可以在 Linux 上提供相同的功能。所有其他依赖项在两个平台上都兼容。
我知道我可以有 2 个单独的需求文件来分别解决两个平台依赖项。像 win_requirements.txt 和 linux_requirements.txt 这样的东西,但是这种方法感觉不是最好的方法。
我想知道是否有一种方法可以让我只有一个 requirements.txt 文件,这样任何用户都可以使用pip install -r requirements.txt
安装所有依赖项,而不管它们是什么平台?
也许像??:
SOAPpy>=0.12.22
pycrypto>=2.6.1
suds>=0.4
Python-ldap>=2.4.19
paramiko>=1.15.2
nose>=1.3.4
selenium>=2.44.0
bottle>=0.12.8
CherryPy>=3.6.0
pika>=0.9.14
if platform.system() == 'Linux':
wmi-client-wrapper>=0.0.12
else if platform.system() == 'Windows':
WMI>=1.4.9
【问题讨论】:
强烈建议查看 Tony G 的答案,而不是接受的答案:***.com/a/35614580/872328 【参考方案1】:您可以在分号后添加某些条件要求。对 sys_platform 和 python_version 特别有用。
例子:
atomac==1.1.0; sys_platform == 'darwin'
futures>=3.0.5; python_version < '3.0'
futures>=3.0.5; python_version == '2.6' or python_version=='2.7'
显然您也可以排除特定版本的库:
futures>=3.0,!=3.0.5
它们在PEP 508 和PEP 0345 (Environment Markers) 中定义,但语法似乎遵循草案PEP 0496。
【讨论】:
pypy也可以查询吗? 其实,我相信它的 PEP 508。 @sebix 是的,看看 PEP。 似乎不适用于哈希固定:如果我有enum34==1.1.6 --hash=sha256:644837f692e5f550741432dd3f223bbb9852018674981b1664e5dc339387588a; python_version < '3.4'
行,我得到Expected sha256 644837f692e5f550741432dd3f223bbb9852018674981b1664e5dc339387588a;
,Got 644837f692e5f550741432dd3f223bbb9852018674981b1664e5dc339387588a
,如果我在;
之前添加一个空格,则版本条件是只是忽略了。
@SimoneBronzini 尝试:enum34==1.1.6; python_version
【参考方案2】:
您可以创建一个install.py
脚本并通过脚本调用pip
。
import pip
_all_ = [
"SOAPpy>=0.12.22",
"pycrypto>=2.6.1",
"suds>=0.4",
"Python-ldap>=2.4.19",
"paramiko>=1.15.2",
"nose>=1.3.4",
"selenium>=2.44.0",
"bottle>=0.12.8",
"CherryPy>=3.6.0",
"pika>=0.9.14",
]
windows = ["wmi-client-wrapper>=0.0.12",]
linux = ["WMI>=1.4.9",]
darwin = []
def install(packages):
for package in packages:
pip.main(['install', package])
if __name__ == '__main__':
from sys import platform
install(_all_)
if platform == 'windows':
install(windows)
if platform.startswith('linux'):
install(linux)
if platform == 'darwin': # MacOS
install(darwin)
仅使用requirements
文件解决此问题的另一种方法是使用requirements
的继承
requirements.txt
SOAPpy>=0.12.22
pycrypto>=2.6.1
suds>=0.4
Python-ldap>=2.4.19
paramiko>=1.15.2
nose>=1.3.4
selenium>=2.44.0
bottle>=0.12.8
CherryPy>=3.6.0
windows.txt
-r requirements.txt
WMI>=1.4.9
linux.txt
-r requirements.txt
WMI>=1.4.9
那么你可以只调用与平台等效的需求。
pip install -r windows.txt
pip install -r linux.txt
【讨论】:
此外,您可能希望通过将 all 块替换为 base_requirements.txt 文件并在不同需求文件的顶部使用 -r base_requirements.txt 来保持 install.py 更清洁。跨度> pip.main() 现在已弃用。见***.com/a/50255019/7234896 如果你有'-r requirements.txt',并且要求有'WMI>=1.4.9',而windows.txt有一个早期版本'WMI>=1.4.8',会不会降级版本? @mike01010 看看here【参考方案3】:您可以在分号后向任何包添加附加要求。您可以通过and
、or
限制任何具有多条件的包。更多条件:https://www.python.org/dev/peps/pep-0508/#environment-markers
例子:
futures>=3.0.5; python_version < '3.0'
futures>=3.0.5; python_version == '2.6' or python_version=='2.7'
futures>3 ; python_version >= "3.6" and sys_platform == "linux"
futures>3.3 ; python_version >= "3.6" and sys_platform == "darwin"
【讨论】:
谢谢,环境标记帮助了。我需要使用 os_name 来检查它是否是 raspberrypi【参考方案4】:在 requirements.txt 文件中使用它
uwsgi==2.0.18; platform_system != "Windows"
在这种情况下,如果不在 Windows 上运行,pip 将安装 uwsgi
【讨论】:
以上是关于有没有办法为基于平台的 Python 应用程序提供条件 requirements.txt 文件?的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot 2 + JdbcTemplate - 有没有办法为每个支持的数据库提供 SQL 查询?
第9章 用Java,Lua,Python和REST API开发基于SAS Viya的应用:SAS Viya开放平台介绍