为pip设定条件安装不同的包
2021年8月5日 - 由Bo 0 评论 6284 阅读
在用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 | posix, java |
sys_platform | sys.platform | linux, linux2, darwin, java1.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() | CPython, Jython |
platform_release | platform.release() | 3.14.1-x86_64-linode39, 14.5.0, 1.8.0_51 |
platform_system | platform.system() | Linux, Windows, Java |
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.4, 2.7 |
python_full_version | platform.python_version() | 3.4.0, 3.5.0b1 |
implementation_name | sys.implementation.name | cpython |
implementation_version | see definition below | 3.4.0, 3.5.0b1 |
extra | An error except when defined by the context interpreting the specification. | test |