有没有办法为我的Python应用程序提供基于平台的条件requirements.txt文件?

Cas*_*Cas 43 python pip

我有一个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
Run Code Online (Sandbox Code Playgroud)

小智 135

您可以在分号后添加某些条件要求,这对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'
Run Code Online (Sandbox Code Playgroud)

显然,您也可以排除库的特定版本:

futures>=3.0,!=3.0.5
Run Code Online (Sandbox Code Playgroud)

它们在PEP 508PEP 0345(环境标记)中定义,但语法似乎遵循草案PEP 0496.

  • 实际上,我相信它的PEP 508. (3认同)
  • @SimoneBronzini 尝试:enum34==1.1.6;python_version &lt; '3.4' --hash=sha256:644837f692e5f550741432dd3f223bbb9852018674981b1664e5dc339387588a (2认同)

Mau*_*ldi 11

您可以创建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)
Run Code Online (Sandbox Code Playgroud)

另一种仅使用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
Run Code Online (Sandbox Code Playgroud)

windows.txt

-r requirements.txt
WMI>=1.4.9
Run Code Online (Sandbox Code Playgroud)

linux.txt

-r requirements.txt
WMI>=1.4.9
Run Code Online (Sandbox Code Playgroud)

然后你可以只调用相当于平台的要求.

pip install -r windows.txt
pip install -r linux.txt
Run Code Online (Sandbox Code Playgroud)

  • 另外,可能希望通过将base块替换为base_requirements.txt文件并使用不同需求文件顶部的-r base_requirements.txt来保持install.py清理. (2认同)

gsh*_*hmu 7

您可以在分号后向任何包添加其他要求。您可以通过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"
Run Code Online (Sandbox Code Playgroud)


mat*_*als 5

在requirements.txt文件中使用它

uwsgi==2.0.18; platform_system != "Windows"
Run Code Online (Sandbox Code Playgroud)

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