检查Linux发行版名称

43 投票
15 回答
40761 浏览
提问于 2025-04-15 22:17

我需要从一个Python脚本中获取Linux发行版的名称。Python的platform模块里有一个叫dist的方法:

import platform
platform.dist()

但是在我的Arch Linux上,它返回的是:

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

这是为什么呢?我该怎么才能获取到名称呢?

附注:我需要检查一下这个发行版是否是基于Debian的。


更新:我在这里发现,Python网站上说,dist()方法从2.6版本开始就不推荐使用了。

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

15 个回答

16

之所以 platform.linux_distribution 无法识别某些Linux发行版,是因为这些发行版提供版本信息的方式不统一。

我写了一个叫 distro 的包(现在可以通过 pip 安装),它的目的是替代 distro.linux_distribution。这个包可以在很多发行版上使用,而这些发行版在使用 platform 时可能会返回奇怪或空的结果。

你可以在这里找到它:https://github.com/nir0s/distrodistro,在pypi上)

这个包提供了一个更详细的接口,用来获取与发行版相关的信息。

$ 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')

顺便提一下,platform.linux_distribution 将在Python 3.7中被移除。

20

我找到了一些信息:

platform.linux_distribution

这个功能是用来尝试确定Linux操作系统的发行版名称。

它提到从Python 2.6开始,platform.dist这个功能就不再推荐使用了,你需要在Python 2中使用platform.linux_distribution(不过在Python 3.5中它也不再推荐使用了)。

12

在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基础文件包。

撰写回答