【问题标题】:Python: How to determine the specific Linux distribution being used?Python:如何确定正在使用的特定 Linux 发行版?
【发布时间】:2016-01-14 14:16:55
【问题描述】:

我想知道如何从 Python 脚本中确定我所使用的精确 Linux 发行版(不包括版本号),并定义一个与其相等的变量。现在,我应该澄清并说我已经看到了这两个问题:

这两个问题对我都没有帮助,因为这些问题中的第一个问题的答案非常笼统,仅针对所有 Linux 发行版返回了 posix。第二个问题的答案没有帮助,因为我有时会在一些更晦涩的发行版上运行,比如 Manjaro Linux 和 Sabayon Linux。第二个问题最适用的答案是 platform.linux_distribution(),它在 Manjaro 上返回:

('', '', '')

如您所见,这没有帮助。现在我知道了一种方法可以让我得到一个可接受的答案,例如:

from subprocess import call
call(["lsb_release", "-si"])

返回输出(当然是在 Manjaro Linux 上):

ManjaroLinux
0

但是定义了一个变量:

a=call(["lsb_release", "-si"])

给出一个带有值的a:

>>> a
0

【问题讨论】:

    标签: python linux


    【解决方案1】:

    “a”只是退出状态,试试:

    from subprocess import Popen, PIPE, STDOUT
    cmd = "lsb_release -si"
    p = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True)
    output = p.stdout.read()
    

    【讨论】:

    • 对我来说output 正在返回b'ManjaroLinux\n',有什么办法可以去掉b\n
    • 这仅返回操作系统,在我的情况下没有版本。
    • @MikeVella 返回"b'ManjaroLinux'"
    • just output.strip() then - b 前缀表示这是一个字节文字,b 被忽略 - 它将表现为普通字符串,有更多关于此 here 的详细信息但你几乎可以肯定不用担心。
    • 正如@Rolbrok 所指出的, output.decode().rstrip('\n') 将起作用
    【解决方案2】:

    用 check_output 替换调用。

    from subprocess import check_output
    a = check_output(["lsb_release", "-si"])
    

    【讨论】:

    • 与迈克的回答相同,这没有为操作系统提供任何版本(至少是我的)。
    【解决方案3】:
    In [24]: open('/etc/lsb-release').readline().strip().split('=')[-1]
    Out[24]: 'LinuxMint'
    

    【讨论】:

    • 这是我将接受的,因为它是第一个给我我正在寻找的确切输出的人。
    • @BrentonHorne 这个答案是否还会打印出您的操作系统版本?
    • 不,这个问题只是关于发行版的名称,而不是版本。我通常使用与版本号无关的滚动发布模型发行版(Manjaro 和 Sabayon 就是这样)。
    • 这条信息应该明确添加到问题中。
    【解决方案4】:

    open("/etc/issue","r").read() 呢?

    【讨论】:

    • 为我返回'Manjaro Linux \\r (\\n) (\\l)\n\n\n',如果你能从中去掉` \\r (\\n) (\\l)\n\n\n`,我会接受这个答案。
    • 就我而言,这提供了比使用 Mike 的代码更多的信息(而且更简单)。 Mike 只返回elementary OS,而这个返回'elementary OS Freya \\n \\l\n'。有垃圾字符,但它给出了操作系统版本。
    【解决方案5】:

    你也可以试试 subprocess.check_output。 基于文档:“使用参数运行命令并将其输出作为字节字符串返回。”文档:https://docs.python.org/2/library/subprocess.html

    代码:

    a = subprocess.check_output(["lsb_release", "-si"])
    

    在我的例子中,输出是:

    'Ubuntu\n'
    

    【讨论】:

      【解决方案6】:

      从我在第二个答案中链接到的链接中可以看到:https://github.com/easybuilders/easybuild/wiki/OS_flavor_name_version

      您注意到 platform.dist 是确定当前 linux 平台的一种更好的方法,但是这在 python 3.5 中已被弃用,并且在 3.8 中已消失。似乎没有一个好的答案。

      然而,奇怪的操作系统有时仍然不会定义这一点,但也绝对不能保证 lsb_release 将在系统上可用...

      dist: ('redhat', '5.8', 'Final')
      dist: ('debian', '4.0', '')
      dist: ('centos', '6.3', 'Final')
      dist: ('fedora', '16', 'Verne')
      dist: ('SuSE', '11.3', 'x86_64')
      dist: ('Ubuntu', '12.10', 'quantal')
      

      【讨论】:

        猜你喜欢
        • 2023-03-27
        • 1970-01-01
        • 2010-09-20
        • 1970-01-01
        • 1970-01-01
        • 2018-07-02
        • 1970-01-01
        • 2011-01-24
        • 1970-01-01
        相关资源
        最近更新 更多