2012-06-17 10 views
6

मैं एक स्क्रिप्ट विकसित कर रहा हूं कि को सिस्टम के पैकेज प्रबंधक की आवश्यकता है। मैंने os.uname() फ़ंक्शन का उपयोग करके फेडोरा, जेनेटू और आर्क लिनक्स की पहचान की है।पहचानना अगर ओएस (ओपन) एसईएसई पायथन में है?

हालांकि, (खुला) SUSE uname परिणाम अन्य लिनक्स Distros के समान है। मुझे Wikipedia पर कई distros के uname परिणाम मिले।

क्या Python के साथ SUSE (खुले) SUSE को पहचानने का कोई स्मार्ट तरीका है? os.uname() की

+1

'बिल्ली/proc/version'? – ChristopheD

+3

यह पहली जगह में उपयोग करना खतरनाक है। आपकी _actual_ समस्या क्या है? क्या आप केवल विशिष्ट क्षमताओं की जांच नहीं कर सकते हैं? – hop

+0

मुझे यह जानने की जरूरत है कि ओएस (ओपन) एसयूएसई है ताकि सही पैकेज इंस्टॉलर (ज़िप्पर) का उपयोग किया जा सके। यदि यह डेबियन (उदाहरण के लिए) है, तो मैं एपीटी-गेट का उपयोग करूंगा ... यही कारण है कि मुझे इसकी आवश्यकता है .... – ant0nisk

उत्तर

6

शीर्ष पर टिप्पणी से:

  • मैं अगर ओएस (ओपन) SUSE है ताकि सही पैकेज इंस्टॉलर का उपयोग करने के लिए (zypper जानने की जरूरत)। यदि यह डेबियन (उदाहरण के लिए) है, तो मैं एपीटी-गेट का उपयोग करूंगा ...

मेरा सुझाव है कि आप सीधे वास्तविक समस्या को हल करें। ओएस की पहचान करने के बजाय, उपलब्ध पैकेज प्रबंधक की पहचान करें।

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 उपयुक्त हैं। मुझे नहीं पता कि एसयूएसई और रेड हैट के लिए समकक्ष निर्देशिकाएं क्या हैं, लेकिन यदि आप उन लोगों का समर्थन कर रहे हैं तो आप इसका पता लगा सकते हैं।

apt-get को Red Hat सिस्टम पर पोर्ट किया गया है, और alien नामक प्रोग्राम के माध्यम से आप rpm डेबियन सिस्टम पर प्राप्त कर सकते हैं, और इसी तरह। पैकेज डेटाबेस का पता लगाने का यह पता लगाने का सबसे मूर्ख तरीका है कि कौन सा पैकेज सिस्टम उपयोग में है।

यदि आप पैकेज प्रबंधक का पता लगाते हैं, तो आपका कोड स्वचालित रूप से सभी संबंधित distros पर काम करेगा।यदि आप dpkg डेटाबेस का पता लगाते हैं, तो आपका कोड डेबियन, उबंटू, लिनक्स मिंट और डेबियन के आधार पर कई अन्य डिस्ट्रोज़ पर काम करेगा। यदि आप rpm डेटाबेस का पता लगाते हैं, तो आपका कोड RP Hat पर आधारित Red Hat, Centos, Fedora, Mandriva और अन्य कई अन्य distros पर काम करेगा।

+0

धन्यवाद! मुझे यही चाहिए! – ant0nisk

+0

आपका स्वागत है! :-) – steveha

0

आउटपुट:

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

uname -a आदेश आप ही जानकारी का देना चाहिए।

% 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() 

आप देता है:

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

और आप प्रासंगिक क्षेत्रों आप की जरूरत ले सकते हैं।

मुझे लगता है कि uname -a कमांड वितरण के लिए कुछ समान उत्पादन प्रदान करता है। यदि नहीं, तो यह काम नहीं करेगा।

+0

डाउनवोट क्यों? मुझे किसी भी त्रुटि को सही करने या उत्तर में सुधार करने, या इसे वापस लेने में प्रसन्नता हो रही है, लेकिन मुझे यह जानने की जरूरत है कि कथित समस्या * पहले * क्या है। – Levon

+2

1. सूज़ का नाम अननाम में नहीं है- – 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') 

काम करना चाहिए।

संबंधित मुद्दे