Проверьте имя дистрибутива Linux

Я должен получить имя дистрибутива Linux из скрипта Python. В модуле платформы есть метод dist:

import platform
platform.dist()

Но под моим Arch Linux он возвращает:

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

Зачем? Как я могу получить имя?

PS. Я должен проверить, является ли дистрибутив основанным на Debian.


Обновление: я нашел здесь сайт Python, что dist() устарела с 2.6.

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

Ответ 1

Это работает для меня на 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

Здесь, что я нашел:

platform.linux_distribution

Пытается определить название Название дистрибутива ОС Linux.

В нем говорится, что platform.dist устарел с 2.6, вы должны использовать platform.linux_distribution в Python 2 (но он также устарел в Python 3.5).

Ответ 3

Он работает здесь. И нет, 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" или "версия" в виде строки. Он также выглядит в стандартном файле выпуска LSB. Если в конце это не сработало, оно прибегает к функции _dist_try_harder, которая пытается получить информацию из других мест.

Таким образом, до Arch Linux требуется стандартная информация о выпуске LSB или исправление Python для использования своего "пути".

Ответ 4

Причина, по которой platform.linux_distribution не идентифицирует некоторые дистрибутивы, заключается в том, что дистрибутивы нестандартным образом предоставляют информацию, связанную с версией.

Я написал пакет под названием distro (теперь используется pip), который призван заменить distro.linux_distribution. Он работает во многих дистрибутивах, которые могут возвращать странные или пустые кортежи при использовании platform.

https://github.com/nir0s/distro (distro, на pypi)

Он предоставляет гораздо более сложный API для получения информации, связанной с распространением.

$ 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.

Ответ 5

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 документирован здесь, хотя я не очень хорошо разбираюсь в документации. Вы не хотите перезаписывать _supported_dists, потому что тогда ваш код будет работать только в Arch Linux. Вы хотите добавить к кортежу.

Фактически, если вы распечатаете значение platform._supported_dists, вы увидите, что единственная разница между Python 2.7.12 и Python 3.5.1 заключается в добавлении ('arch', 'mageia'). Интересный факт: вы также можете добавить 'system' для обнаружения платформы на Amazon Linux.

Ответ 6

Это работало для меня под Ubuntu и Manjaro:

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

Ответ 7

Два варианта для вас:

  • Использование   импортная платформа   platform.linux_distribution()   # Что-то вроде ('Ubuntu', '9.10', 'karmic')

  • Или вы могли бы просто прочитать содержимое /etc/debian _version ( "squeeze/sid" ) или /etc/lsb -release, которое дало бы:

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

Ответ 8

Если вы хотите, чтобы данные читались пользователем, но все еще были подробными, вы можете использовать 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/. вики /OS_flavor_name_version

Ответ 9

Вам, вероятно, придется прибегать к:

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

или вы всегда можете увеличить lib/python2.6/platform.py и отправить свои изменения.