为什么platform.linux_distribution()在一个操作系统上返回不同的结果?

时间:2015-11-30 10:19:17

标签: python linux lsb

我在某个虚拟机2.7.92.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还是其他一些系统命令,还是在某处硬编码?

3 个答案:

答案 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()

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是版本号后括号中的项目。   它通常是代号。

https://docs.python.org/2/library/platform.html?highlight=platform.linux_distribution#platform.linux_distribution

在您的2.7.9结果中,该命令无法确定操作系统中的full_distribution_name(因为它显示为空白),因此它改为使用supported_dists