有没有一种方法可以为基于平台的Python应用程序提供一个conditional requirements.txt文件?

有没有一种方法可以为基于平台的Python应用程序提供一个conditional requirements.txt文件?,python,pip,Python,Pip,我编写了一个python应用程序,它与Linux和Windows平台兼容。但是有一个问题。。。我需要的一个用于Windows的python包与Linux不兼容。幸运的是,还有另一个包在Linux上提供相同的功能。所有其他依赖项在两个平台中都是兼容的 我知道我可以有两个单独的需求文件来分别处理这两个平台依赖关系。比如win_requirements.txt和linux_requirements.txt,但是这种方法并不是最好的方法 我想知道是否有一种方法可以让我只有一个requirements.t

我编写了一个python应用程序,它与Linux和Windows平台兼容。但是有一个问题。。。我需要的一个用于Windows的python包与Linux不兼容。幸运的是,还有另一个包在Linux上提供相同的功能。所有其他依赖项在两个平台中都是兼容的

我知道我可以有两个单独的需求文件来分别处理这两个平台依赖关系。比如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

您可以创建一个
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.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

您可以在分号之后添加某些条件要求,这对于sys\u平台和python\u版本特别有用

示例:

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.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"
期货>=3.0.5;python_版本<'3.0'
期货>=3.0.5;python_版本=='2.6'或python_版本=='2.7'
期货>3;python_版本>=“3.6”和sys_平台==“linux”
期货>3.3;python_版本>=“3.6”和sys_平台==“darwin”

在requirements.txt文件中使用此选项

uwsgi==2.0.18; platform_system != "Windows"

在这种情况下,如果不在Windows上运行,pip将安装uwsgi

强烈建议查看Tony G的答案而不是公认的答案:是否也可以查询pypy?实际上,我相信它的PEP 508。@sebix yes看看PEP。似乎不适用于哈希固定:如果我有行
enum34==1.1.6--hash=sha256:644837f692e5f550741432dd3f23bbb9852018674981b1664e5dc3393878a;python_版本<'3.4'
我得到了
预期的SHA256644837F692E5F550741432DD3F223BBB9852018674981B1664E5DC339387588A
获得644837F692E5F55074143DD3F223BBB9852018674981B1664E5DC339387588A
,如果我在
之前添加空格,版本条件被忽略。@SimoneBronzini try:enum34==1.1.6;python_version<'3.4'--hash=sha256:644837F692E5F550741432DD3F223BBB9852018674981B1664E5DC339387588A此外,您可能希望通过使用base_requirements.txt文件替换all块并在不同需求文件的顶部使用-r base_requirements.txt来保持install.py的清洁度。pip.main()现在已被弃用。查看您是否有'-r requirements.txt',requirements有'WMI>=1.4.9',而windows.txt有一个早期版本'WMI>=1.4.8',它会降低版本吗?@mike01010看一看,谢谢,environment标记帮助了您。我需要使用os_名称来检查它是否为raspberrypi
uwsgi==2.0.18; platform_system != "Windows"