Módulo Python para detectar a versão Distro Linux
Pergunta
Existe um módulo Python existente que pode ser usado para detectar qual distro do Linux e qual versão da distro está instalada no momento.
Por exemplo:
- Redhat Enterprise 5
- Fedora 11
- SUSE Enterprise 11
- etc ....
Eu posso fazer meu próprio módulo analisando vários arquivos como /etc /redhat-lançamento, mas eu queria saber se já existe um módulo?
Saúde, Ivan
Solução
Procure os documentos para o módulo da plataforma: http://docs.python.org/library/platform.html
Exemplo:
>>> platform.uname() ('Linux', 'localhost', '2.6.31.5-desktop-1mnb', '#1 SMP Fri Oct 23 00:05:22 EDT 2009', 'x86_64', 'AMD Athlon(tm) 64 X2 Dual Core Processor 3600+') >>> platform.linux_distribution() ('Mandriva Linux', '2010.0', 'Official')
Outras dicas
A resposta acima não funciona no RHEL 5.x. A maneira mais rápida está em um sistema semelhante ao redhat é ler e observar o arquivo /etc /redhat-lançamento. Este arquivo é atualizado toda vez que você executa uma atualização e o sistema é atualizado por um número de liberação menor.
$ python
>>> open('/etc/redhat-release','r').read().split(' ')[6].split('.')
['5', '5']
Se você retirar as peças divididas, ele apenas lhe dará string. Nenhum módulo como você perguntou, mas achei que era curto e elegante o suficiente para que você ache útil.
Eu escrevi um pacote chamado distro
(agora usado por pip
) que visa substituir distro.linux_distribution
. Funciona em muitas distribuições que podem retornar tuplas estranhas ou esvaziadas ao usar platform
.
https://github.com/nir0s/distro (distro
, em Pypi)
Ele fornece uma API muito mais elaborada para recuperar informações relacionadas à distribuição.
$ 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')
A propósito, platform.linux_distribution
deve ser removido no Python 3.7.
Pode não ser a melhor maneira, mas usei o subprocesso para executar 'uname -v' e, em seguida, procurei o nome da distro na saída.
import subprocess
process = subprocess.Popen(['uname','-v'], stdout=subprocess.PIPE)
stdout = process.communicate()[0]
distro = format(stdout).rstrip("\n")
if 'FreeBSD' in distro:
print "It's FreeBSD"
elif 'Ubuntu' in distro:
print "It's Ubuntu"
elif 'Darwin' in distro:
print "It's a Mac"
else:
print "Unknown distro"