Проверьте имя дистрибутива 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 и отправить свои изменения.