有没有办法为基于平台的 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 &lt; '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】:

您可以在分号后向任何包添加附加要求。您可以通过andor 限制任何具有多条件的包。更多条件: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 文件?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在 Android 上运行 Python?

有没有办法在 Android 上运行 Python?

Spring Boot 2 + JdbcTemplate - 有没有办法为每个支持的数据库提供 SQL 查询?

第9章 用Java,Lua,Python和REST API开发基于SAS Viya的应用:SAS Viya开放平台介绍

有没有办法使用 java 驱动程序为大查询创建基于非摄取时间的分区表?

Dodobox一个基于所有平台的嵌入式操作系统(OS)