Проверьте имя дистрибутива Linux - PullRequest
28 голосов
/ 03 мая 2010

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

import platform
platform.dist()

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

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

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

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


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

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

Ответы [ 9 ]

15 голосов
/ 03 мая 2010

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

platform.linux_distribution

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

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

10 голосов
/ 03 мая 2010

Это работает для меня в 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 содержит эту информацию, которая поступает из пакета базовых файлов Debian Ubuntu.

6 голосов
/ 03 мая 2010

Это работает здесь. И нет, 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, чтобы использовать их «путь».

5 голосов
/ 01 апреля 2017

Причина, из-за которой 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.

2 голосов
/ 05 ноября 2016

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 является скользящим выпуском, поэтому у него нет версии или идентификатора.

Аргумент supported_dists задокументирован здесь , хотя я не нахожу документацию очень ясной. Вы не хотите перезаписывать _supported_dists, потому что тогда ваш код будет только работать на Arch Linux. Вы хотите добавить к кортежу.

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

1 голос
/ 30 мая 2015

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

def get_distro():
    """
    Name of your Linux distro (in lowercase).
    """
    with open("/etc/issue") as f:
        return f.read().lower().split()[0]
0 голосов
/ 09 января 2019

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

0 голосов
/ 03 мая 2010

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

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

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

0 голосов
/ 03 мая 2010

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

  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"
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...