簡體   English   中英

為什么platform.linux_distribution()在一個操作系統上返回不同的結果?

[英]Why does platform.linux_distribution() returns different results on one OS?

我在一些虛擬機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還是其他一些系統命令,還是在某處硬編碼?

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

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM