2012-06-17 9 views
6

시스템의 패키지 관리자가 필요한 스크립트를 개발 중입니다. 나는 os.uname() 기능을 사용하여 Fedora, Gentoo 및 Arch Linux를 확인했습니다.OS가 파이썬에서 (열림) SUSE 일 경우 식별 하시겠습니까?

그러나 (열림) 수세 uname 결과는 다른 Linux 배포판과 동일합니다. Wikipedia에 많은 배포판의 결과가 uname 인 것을 발견했습니다.

파이썬으로 수세를 식별 (열어 볼 수있는) 현명한 방법이 있습니까? os.uname()

+1

'cat/proc/version'? – ChristopheD

+3

처음 사용하는 것은 위험합니다. 당신의 _actual_ 문제는 무엇입니까? 필요한 특정 기능을 확인할 수 없습니까? – hop

+0

올바른 패키지 설치 프로그램 (zypper)을 사용하려면 OS가 (Open) SUSE인지 알아야합니다. 그것이 DEBIAN (예를 들어)이라면, 나는 apt-get을 사용할 것입니다 ... 그래서 그것이 내가 필요로하는 이유입니다 ... – ant0nisk

답변

6

:

  • 내가 올바른 패키지 설치 프로그램을 사용하도록 OS가 (오픈) SUSE는 (zypper 경우 알 필요가). 만약 DEBIAN (예를 들어)이라면, 나는 apt-get을 사용할 것이다 ...

나는 실제 문제를 직접 해결할 것을 제안한다. OS를 확인하는 대신 사용 가능한 패키지 관리자를 확인하십시오.

import os 
def file_exists(fname): 
    try: 
     os.stat(fname) 
     return True 
    except OSError: 
     return False 


if file_exists('/usr/bin/zypper'): 
    ... # do the SUSE case 
elif file_exists('/usr/bin/apt-get'): 
    ... # do the Debian/Ubuntu case 
elif file_exists('/usr/bin/yum'): 
    ... # do the Red Hat case 
else: 
    raise OSError, "cannot find a usable package manager" 

편집 : 여기 코드는 패키지 관리자 프로그램을 검색하는 것을 보여 주지만 주요 패키지 레지스트리 자체를 검색하는 것이 더 좋을 수 있습니다. 예를 들어, dpkg, 을 사용하는 데비안/우분투 시스템에서는 패키지 데이터베이스를 가지고있는 디렉토리 /var/lib/dpkg이있을 것입니다. 이는 dpkg 또는 apt-get이라는 적절한 기호입니다. SUSE와 Red Hat 등등에 해당하는 디렉토리가 무엇인지 모르지만, 지원하는 경우 찾을 수 있습니다.

apt-get은 Red Hat 시스템으로 이식되었고 alien이라는 프로그램을 통해 데비안 시스템에서는 rpm을 얻을 수 있습니다. 패키지 데이터베이스 자체를 감지하는 것은 사용중인 패키지 시스템을 파악하는 가장 간단한 방법입니다.

패키지 관리자를 발견하면 코드가 모든 관련 배포판에서 자동으로 작동합니다.dpkg 데이터베이스를 발견하면 데비안 기반의 데비안, 우분투, 리눅스 민트 및 다른 많은 배포판에서 코드가 작동합니다. rpm 데이터베이스를 발견하면 RPM을 기반으로 Red Hat, Centos, Fedora, Mandriva 및 기타 여러 배포판에서 코드가 작동합니다.

+0

감사! 그게 내가 필요한거야! – ant0nisk

+0

여러분을 환영합니다! :-) – steveha

0

출력 : uname -a 명령은 당신에게 같은 많은 정보를 제공해야합니다

('Linux', 
'i7', 
'2.6.32-41-generic', 
'#90-Ubuntu SMP Tue May 22 11:31:25 UTC 2012', 
'i686') 

.

['Linux', 
'i7', 
'2.6.32-41-generic', 
'#90-Ubuntu', 
'SMP', 
'Tue', 
'May', 
'22', 
'11:31:25', 
'UTC', 
'2012', 
'i686', 
'GNU/Linux'] 

그리고 당신은 당신이 필요로하는 관련 필드를 선택할 수 있습니다 :

% uname -a 
Linux i7 2.6.32-41-generiC#90-Ubuntu SMP Tue May 22 11:31:25 UTC 2012 i686 GNU/Linux 

distr = os.popen('uname -a').read().split() 

당신을 제공합니다.

uname -a 명령은 배포판에 대해 다소 균일 한 출력을 제공한다고 가정합니다. 그렇지 않으면 작동하지 않습니다.

+0

왜 downvote? 오류를 수정하거나 답변을 향상 시키거나 철회하게되어 기쁩니다. 그러나 먼저인지 된 문제가 무엇인지 알아야합니다. – Levon

+2

1. 수세는 uname -a에 이름이 없습니다. – unbeli

+0

@ unbeli 첫 번째 주석 (수세가'uname -a'에 대해 표시하는 것)을 고맙게 생각합니다. 두 번째 코멘트는 무례하고 라인이 맞지 않습니다. – Levon

7

배포판이 Linux Standard Base 다음에 오면 lsb_release -i의 출력을 읽을 수 있습니다. 이 같은

뭔가 : 상단의 의견에서

import os 

try: 
    distro = os.popen('lsb_release -i').read().split(':')[1].strip() 
except IndexError: 
    distro = None 
+0

네, 그건 내 스크립트에 정말 도움이 될 수 있습니다! – ant0nisk

0

파이썬 보일러의이 작은 비트 플랫폼 정보를 출력합니다 :

import platform 

print platform.linux_distribution() 
('openSUSE ', '11.4', 'x86_64') 

이 작업을 수행해야합니다.