我在某个虚拟机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
还是其他一些系统命令,还是在某处硬编码?
答案 0 :(得分:4)
Ubuntu 14.04包含两个发布文件:
platform.linux_distribution()
两者都由函数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
>
使用但是,这个函数由Ubuntu修补以返回Ubuntu OS名称,另请参阅代码中的注释(右边是Ubuntu安装的文件,左边是来自的文件) Python 2.7.10中的源代码:
/etc/debian_version
您的python 2.7.9编译了源代码,不包含来自Ubuntu的补丁,这就是为什么它返回company
的内容
答案 1 :(得分:2)
查看linux_distribution()
/etc
,r'(\w+)[-_](release|version)'
匹配的文件。在我的操作系统上,它选择debian_version
文件。debian
)并查看它是否在受支持的列表中(静态数组:platform._supported_dists
)_dist_try_harder(distname,version,id)
。这将从/var/adm/inst-log/info
,/etc/.installed
或/usr/lib/setup
返回版本(按此顺序,首先存在的文件将被解析并返回)。因此,根据linux_distribution()
读取信息的位置,您可能会遇到不同的输出。
答案 2 :(得分:1)
platform.linux_distribution (distname =&#39;&#39;,version =&#39;&#39;,id =&#39;&#39;, supported_dists =(&#39; SuSE&#39;,&#39; debian&#39;,&#39; redhat&#39;,&#39; mandrake&#39;,...),full_distribution_name = 1)子>
尝试确定Linux OS分发名称的名称。
可以给予supported_dists来定义一组Linux发行版 寻找。它默认为当前支持的Linux列表 由其发布文件名识别的分发。
如果full_distribution_name为true(默认值),则为完整分发 从OS读取返回。否则短名取自 使用supported_dists。
返回一个元组(distname,version,id),默认为给定的args 作为参数。 id是版本号后括号中的项目。 它通常是代号。
在您的2.7.9
结果中,该命令无法确定操作系统中的full_distribution_name
(因为它显示为空白),因此它改为使用supported_dists
。