Bob's Blog

Web开发、测试框架、自动化平台、APP开发、机器学习等

返回上页首页

为pip设定条件安装不同的包



在用python时,我们都是类似pip install requests来安装需要的包; 但是开发一个平台或者工具时,有时需要根据当前环境来安装不同的包,于是需要能设定一些条件。

假设当前需要根据操作系统类型来决定安装的版本。这里有三种方式,最好的应该是第三种:

第一种:

直接定义不同的requirements.txt,比如windows上就是requirements-win.txt,linux上就是requirements.linux.txt;这种最粗暴,但还是更推荐另两种方式。

第二种:

自定义一个安装的py脚本,判断当前系统类型,调用pip来安装对应的包。但是违背了包版本作为配置信息的管理。

from sys import platform
import pip

_all_ = [
    "Django==2.2.9",
    "django-auth-ldap==2.1.0",
    "django-cors-headers==3.2.1",
    "django-rest-swagger==2.1.2",
    "djangorestframework==3.9.2",
]

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__':
    install(_all_) 
    if platform == 'windows':
        install(windows)
    if platform.startswith('linux'):
        install(linux)
    if platform == 'darwin':
        install(darwin)

第三种:

直接在requirements.txt里定义条件,但不是用的if语句这种。

比如如下的requirements.txt,用pip install命令能达到第二种一样的效果。

Django==2.2.9
django-auth-ldap==2.1.0
django-cors-headers==3.2.1
django-rest-swagger==2.1.2
djangorestframework==3.9.2
wmi-client-wrapper>=0.0.12; sys_platform == "linux"
WMI>=1.4.9; sys_platform == "win32"

这种被称为environment_marker,还可以使用os_name、platform_version、python_version等。可以参考这个链接:https://www.python.org/dev/peps/pep-0508/#environment-markers

Marker Python equivalent Sample values
os_name os.name posixjava
sys_platform sys.platform linuxlinux2darwinjava1.8.0_51 (note that "linux" is from Python3 and "linux2" from Python2)
platform_machine platform.machine() x86_64
platform_python_implementation platform.python_implementation() CPythonJython
platform_release platform.release() 3.14.1-x86_64-linode3914.5.01.8.0_51
platform_system platform.system() LinuxWindowsJava
platform_version platform.version() #1 SMP Fri Apr 25 13:07:35 EDT 2014 Java HotSpot(TM) 64-Bit Server VM, 25.51-b03, Oracle Corporation Darwin Kernel Version 14.5.0: Wed Jul 29 02:18:53 PDT 2015; root:xnu-2782.40.9~2/RELEASE_X86_64
python_version '.'.join(platform.python_version_tuple()[:2]) 3.42.7
python_full_version platform.python_version() 3.4.03.5.0b1
implementation_name sys.implementation.name cpython
implementation_version see definition below 3.4.03.5.0b1
extra An error except when defined by the context interpreting the specification. test
下一篇:  微信小程序开发(一)初探样例
上一篇:  用docker给centos镜像装python3以及上传artifacts

共有0条评论

添加评论

暂无评论