![](/img/trans.png)
[英]platform.linux_distribution() deprecated - what are the alternatives?
[英]Why does platform.linux_distribution() returns different results on one OS?
我在一些虚拟机2.7.9
和2.7.6
上安装了2个版本的python。 从系统包安装2.7.6
从源安装2.7.9
。 这台机器在Ubuntu 14.04上运行。
我想使用platform
模块来获取有关linux发行版的信息。 然而事实证明,在这两个版本中,我得到了platform.linux_distribution()
不同结果。
Python 2.7.9 (...)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import platform
>>> platform.linux_distribution()
('debian', 'jessie/sid', '')
Python 2.7.6 (...)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import platform
>>> platform.linux_distribution()
('Ubuntu', '14.04', 'trusty')
知道为什么会这样吗? 或者更一般地说,平台模块如何获得有关linux发行版的信息。 它是基于lsb_relase
还是其他一些系统命令,还是在某处硬编码?
Ubuntu 14.04包含两个发布文件:
# cat /etc/os-release
NAME="Ubuntu"
VERSION="14.04.3 LTS, Trusty Tahr"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 14.04.3 LTS"
VERSION_ID="14.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
root@yeni2:/# cat /etc/debian_version
jessie/sid
两者都由函数platform.linux_distribution()
但是,这个函数由Ubuntu修补以返回Ubuntu OS名称,另请参阅代码中的注释(右边是Ubuntu安装的文件,左边是找到的源文件)在Python 2.7.10):
Python-2.7.10 # diff Lib/platform.py /mnt/ubu/\@/usr/lib/python2.7/platform.py
1c1
< #!/usr/bin/env python
---
> #! /usr/bin/python2.7
262c262
< 'UnitedLinux', 'turbolinux')
---
> 'UnitedLinux', 'turbolinux', 'Ubuntu')
290a291,294
> _distributor_id_file_re = re.compile("(?:DISTRIB_ID\s*=)\s*(.*)", re.I)
> _release_file_re = re.compile("(?:DISTRIB_RELEASE\s*=)\s*(.*)", re.I)
> _codename_file_re = re.compile("(?:DISTRIB_CODENAME\s*=)\s*(.*)", re.I)
>
314a319,337
> # check for the LSB /etc/lsb-release file first, needed so
> # that the distribution doesn't get identified as Debian.
> try:
> with open("/etc/lsb-release", "rU") as etclsbrel:
> for line in etclsbrel:
> m = _distributor_id_file_re.search(line)
> if m:
> _u_distname = m.group(1).strip()
> m = _release_file_re.search(line)
> if m:
> _u_version = m.group(1).strip()
> m = _codename_file_re.search(line)
> if m:
> _u_id = m.group(1).strip()
> if _u_distname and _u_version:
> return (_u_distname, _u_version, _u_id)
> except (EnvironmentError, UnboundLocalError):
> pass
>
你的python 2.7.9编译了源码,不包含来自Ubuntu的补丁,这就是为什么它返回/etc/debian_version
的内容
查看linux_distribution()
的源代码
/etc
中的所有文件, r'(\\w+)[-_](release|version)'
匹配的文件。 在我的操作系统上,它选择debian_version
文件。 debian
)的第一个匹配,并查看它是否在受支持的列表中(静态数组: platform._supported_dists
) _dist_try_harder(distname,version,id)
。 这将返回/var/adm/inst-log/info
, /var/adm/inst-log/info
/etc/.installed
/usr/lib/setup
/etc/.installed
或/usr/lib/setup
( /etc/.installed
顺序,解析并返回第一个存在的文件)。 因此,您可能会根据linux_distribution()
读取信息的位置遇到不同的输出 。
platform.linux_distribution (distname ='',version ='',id ='',supported_dists =('SuSE','debian','redhat','mandrake',...),full_distribution_name = 1)
尝试确定Linux OS分发名称的名称。
可以给予supported_dists来定义要查找的Linux发行版集。 它默认为由其发布文件名标识的当前支持的Linux发行版列表。
如果full_distribution_name为true(默认值),则返回从OS读取的完整分发。 否则,使用从supported_dists获取的短名称。
返回一个元组(distname,version,id),它默认为作为参数给出的args。 id是版本号后括号中的项目。 它通常是代号。
↳https : //docs.python.org/2/library/platform.html ? highlight = platform.linux_distribution#platform.linux_distribution
在2.7.9
结果上,该命令无法确定操作系统中的full_distribution_name
(因为它显示为空白),因此它改为使用supported_dists
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.