检查Linux发行版名称
我需要从一个Python脚本中获取Linux发行版的名称。Python的platform模块里有一个叫dist
的方法:
import platform
platform.dist()
但是在我的Arch Linux上,它返回的是:
>>> platform.dist()
('', '', '')
这是为什么呢?我该怎么才能获取到名称呢?
附注:我需要检查一下这个发行版是否是基于Debian的。
更新:我在这里发现,Python网站上说,dist()方法从2.6版本开始就不推荐使用了。
>>> platform.linux_distribution()
('', '', '')
15 个回答
之所以 platform.linux_distribution
无法识别某些Linux发行版,是因为这些发行版提供版本信息的方式不统一。
我写了一个叫 distro
的包(现在可以通过 pip
安装),它的目的是替代 distro.linux_distribution
。这个包可以在很多发行版上使用,而这些发行版在使用 platform
时可能会返回奇怪或空的结果。
你可以在这里找到它:https://github.com/nir0s/distro (distro
,在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中被移除。
我找到了一些信息:
platform.linux_distribution
这个功能是用来尝试确定Linux操作系统的发行版名称。
它提到从Python 2.6开始,platform.dist
这个功能就不再推荐使用了,你需要在Python 2中使用platform.linux_distribution
(不过在Python 3.5中它也不再推荐使用了)。
在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基础文件包。