检查Linux发行版名称

时间:2010-05-03 07:41:24

标签: python linux

我必须从Python脚本中获取Linux发行版名称。平台模块中有一个dist方法:

import platform
platform.dist()

但在我的Arch Linux下它返回:

>>> platform.dist()
('', '', '')

为什么呢?我怎么能得到这个名字?

PS。我必须检查分发是否是基于Debian的。


更新:我在这里找到Python site,自2.6以来,dist()已被弃用。

>>> platform.linux_distribution()
('', '', '')

11 个答案:

答案 0 :(得分:15)

Here是我找到的:

platform.linux_distribution
     

尝试确定名称   Linux OS分发名称。

它说自{2.6}以来已弃用platform.dist,你必须在Python 2中使用platform.linux_distribution(但在Python 3.5中也不推荐使用它)。

答案 1 :(得分:10)

这适用于Ubuntu:

('Ubuntu', '10.04', 'lucid')

然后我使用strace来找出平台模块正在做什么来查找分布,这就是这个部分:

open("/etc/lsb-release", O_RDONLY|O_LARGEFILE) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=102, ...}) = 0
fstat64(3, {st_mode=S_IFREG|0644, st_size=102, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb76b1000
read(3, "DISTRIB_ID=Ubuntu\nDISTRIB_RELEAS"..., 8192) = 102
read(3, "", 4096)                       = 0
read(3, "", 8192)                       = 0
close(3)                                = 0

所以,有/etc/lsb-release包含这些信息,它来自Ubuntu的Debian基础文件包。

答案 2 :(得分:6)

它适用于此。不,Arch Linux不是基于Debian的。

>>> import platform
>>> platform.dist()
('SuSE', '11.2', 'x86_64')

因此Python不知道如何获取Arch Linux发布信息,并且已经硬编码寻找/ etc / redhat-release和/ etc / SuSE-release。

platform.dist()是一个过时的功能。你应该使用platform.linux_distribution()

实际上,在我的系统上会产生不同的结果:

>>> platform.linux_distribution()
('openSUSE ', '11.2', 'x86_64')

platform.linux_distribution()在/ etc文件中查找包含“release”或“version”的字符串。它还查看标准LSB版本文件。如果在最后不起作用,它会转向_dist_try_harder函数,该函数试图从其他地方获取信息。

因此,Arch Linux可以提供标准的LSB发布信息,也可以修补Python使用它们的“方式”。

答案 3 :(得分:5)

因为 //keep track of all fragments you add by tagging fragmentTransacaction.add(R.id.content, new FragA(), "first"); //and when removeing Fragment f = getFragmentManager().findFragmentByTag("first"); if(f!=null) fragmentTransac.remove(f); fragmentTransac.commit(); 无法识别某些发行版的原因是因为非标准化的方式发行版提供了与自身相关的版本信息。

我写了一个名为platform.linux_distribution的包(现在由distro使用),旨在取代pip。它适用于许多使用distro.linux_distribution时可能返回奇怪或空元组的发行版。

https://github.com/nir0s/distroplatform,关于pypi)

它提供了更精细的API来检索与分发相关的信息。

distro

顺便说一句,在Python 3.7中删除$ python Python 2.7.12 (default, Nov 7 2016, 11:55:55) [GCC 6.2.1 20160830] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import distro >>> distro.linux_distribution() (u'Antergos Linux', '', u'ARCHCODE')

答案 4 :(得分:2)

Python 2无法正确检测Arch Linux。这在Python 3.3+中得到了修复,但从未反向移植到Python 2.以下是一些官方错误报告:

https://bugs.python.org/issue20454
https://bugs.python.org/issue11678

Python 2中针对此问题的解决方法非常简单。你只需要告诉平台模块" arch"是受支持的发行版:

>>> import platform
>>> platform.linux_distribution(supported_dists=platform._supported_dists + ('arch',))
('arch', '', '')

请注意,Arch Linux是一个滚动版本,因此它没有版本或ID。

supported_dists参数已记录here,但我发现文档不太清楚。您不想覆盖_supported_dists,因为您的代码在Arch Linux上运行。你想附加到元组。

事实上,如果你打印出platform._supported_dists的值,你会发现Python 2.7.12和Python 3.5.1之间的唯一区别是添加('arch', 'mageia')。有趣的事实:您还可以在Amazon Linux上附加'system'进行平台检测。

答案 5 :(得分:1)

这在Ubuntu和Manjaro的帮助下适用于我:

def get_distro():
    """
    Name of your Linux distro (in lowercase).
    """
    with open("/etc/issue") as f:
        return f.read().lower().split()[0]

答案 6 :(得分:1)

要在python中获取Linux发行版名称:

import distro
print(distro.id())

我正在运行Arch Linux,因此它将返回:

arch

有关可用的发行版值,请参见文档:https://distro.readthedocs.io/en/latest/

答案 7 :(得分:1)

这里:

import sys, platform
print(sys.platform, platform.platform())
OUT [1]: linux Linux-5.4.44-1-MANJARO-x86_64-with-glibc2.2.5

答案 8 :(得分:0)

有两种选择:

  1. 使用     进口平台     platform.linux_distribution()     #某事('Ubuntu','9.10','karmic')

  2. 或者你可以阅读/ etc / debian_version(“squeeze / sid”)或/ etc / lsb-release的内容,它们会给出:

    DISTRIB_ID=Ubunt
    DISTRIB_RELEASE=9.10
    DISTRIB_CODENAME=karmic
    DISTRIB_DESCRIPTION="Ubuntu 9.10"
    

答案 9 :(得分:0)

如果您希望用户可读的数据但仍然很详细,则可以使用platform.platform()

>>> import platform
>>> platform.platform()
'Linux-3.3.0-8.fc16.x86_64-x86_64-with-fedora-16-Verne'

您可以拨打以下几种不同的电话来识别自己的身份

import platform
import sys

def linux_distribution():
  try:
    return platform.linux_distribution()
  except:
    return "N/A"

print("""Python version: %s
dist: %s
linux_distribution: %s
system: %s
machine: %s
platform: %s
uname: %s
version: %s
mac_ver: %s
""" % (
sys.version.split('\n'),
str(platform.dist()),
linux_distribution(),
platform.system(),
platform.machine(),
platform.platform(),
platform.uname(),
platform.version(),
platform.mac_ver(),
))

此脚本的输出在几种不同的系统(Linux,Windows,Solaris,MacOS)上运行,并且体系结构(x86,x64,Itanium,power pc,sparc)可在此处使用:https://github.com/hpcugent/easybuild/wiki/OS_flavor_name_version

答案 10 :(得分:-1)

你可能不得不诉诸:

if platform.linux_distribution() == ('', '', ''):
    # do something specific to look for Arch

或者您可以随时增加lib / python2.6 / platform.py并发送您的更改。