2010-05-03 13 views
22

मुझे एक पायथन लिपि से लिनक्स वितरण नाम प्राप्त करना है। वहाँ मंच मॉड्यूल में एक dist विधि है:लिनक्स वितरण नाम की जांच करें

import platform 
platform.dist() 

लेकिन मेरे आर्क लिनक्स के तहत यह रिटर्न:

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

क्यों? मैं नाम कैसे प्राप्त कर सकता हूं?

पी एस। मुझे यह जांचना है कि वितरण डेबियन आधारित है या नहीं।


अद्यतन: मैं यहाँ Python site पाया गया कि जिले() 2.6 के बाद से मान्य नहीं है।

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

@ किमवाइस मेरा मतलब है कि किसी भी फाइल को पार्स किए बिना पाइथन स्क्रिप्ट से बिल्कुल नाम प्राप्त करने के बारे में, केवल स्टैंडअर्ट विधियां। – Ockonal

+0

आर्क पर 'uname -a' वापसी क्या करता है? platform.py 1600 लाइनों की कोशिश कर रहा है जो वे विभिन्न प्रणालियों में अंतर करने के बारे में सोच सकते हैं; यह हेरिस्टिक्स का एक बड़ा ढेर है। आर्क भी केवल अपने आप पर आधारित है, कोई अन्य distro: http://en.wikipedia.org/wiki/Arch_Linux – msw

+0

आर्क के तहत 'lsb_release -is' वापसी क्या करता है? यदि 'platform.dist()' आपको कोई उपयोगी डेटा नहीं देता है तो आप 'subprocess.check_output ([" lsb_release "," - is "]" को इसके बजाय कॉल कर सकते हैं। – panzi

उत्तर

9

यह 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 है जिसमें यह जानकारी है, जो उबंटू के डेबियन बेस-फाइल पैकेज से आता है।

+0

ध्यान दें कि कभी-कभी फ़ाइल '/ etc/os-release' है। – panzi

12

Here की मैं क्या पाया:

platform.linux_distribution 

प्रयास लिनक्स ओएस वितरण का नाम निर्धारित करने के लिए।

इसे कहते हैं platform.dist 2.6 के बाद से हटा दिया गया है, तो आप अजगर 2 में platform.linux_distribution उपयोग करने के लिए (लेकिन यह भी अजगर 3.5 में पदावनत किया गया है)। आप के लिए

0

दो विकल्प:

  1. उपयोग आयात मंच platform.linux_distribution() # कुछ की तरह ('उबंटू', '9.10', 'कर्म')

  2. या आप बस/etc/debian_version ("निचोड़/sid") या/etc/LSB रिलीज की सामग्री को जो देना होगा पढ़ सकता है:

    DISTRIB_ID=Ubunt 
    DISTRIB_RELEASE=9.10 
    DISTRIB_CODENAME=karmic 
    DISTRIB_DESCRIPTION="Ubuntu 9.10" 
    
+0

के बाद से बहिष्कृत किया गया है दुर्भाग्यवश, पहला विकल्प आर्क लिनक्स पर काम नहीं करता है। मेरे पास इस समय आर्क तक पहुंच नहीं है, इसलिए मैं दूसरे विकल्प का परीक्षण नहीं कर सकता। –

4

यह यहां काम करता है। और नहीं, आर्क लिनक्स डेबियन आधारित नहीं है।

>>> import platform 
>>> platform.dist() 
('SuSE', '11.2', 'x86_64') 

तो अजगर कैसे आर्क लिनक्स रिलीज जानकारी पाने के लिए पता नहीं है, और इसके लिए/etc/redhat-release और/etc/SuSE रिलीज की तलाश में hardcoded गया है।

platform.dist() एक अप्रचलित कार्य है। आपको मंच का उपयोग करना चाहिए।linux_distribution()

वास्तव में, अपने सिस्टम पर यह एक अलग परिणाम पैदावार:

>>> platform.linux_distribution() 
('openSUSE ', '11.2', 'x86_64') 

platform.linux_distribution() "रिलीज" या स्ट्रिंग के रूप में "संस्करण" युक्त/आदि फाइलों में लग रहा है। यह मानक एलएसबी रिलीज फ़ाइल में भी दिखता है। यदि अंत में काम नहीं करता है, तो यह _dist_try_harder फ़ंक्शन पर रिसॉर्ट करता है जो अन्य स्थानों से जानकारी प्राप्त करने का प्रयास करता है।

तो यह आर्क लिनक्स अप करने के लिए एक मानक LSB रिहाई जानकारी प्रदान करने के लिए या अपने "रास्ता" का उपयोग करने के अजगर पैच करने के लिए है।

-1

आप शायद का सहारा लेना होगा:

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

या आप हमेशा lib/python2.6/platform.py बढ़ाने और अपने परिवर्तन में भेज सकते हैं।

+1

इस प्रकार की तुलना खतरनाक है क्योंकि आर्क लिनक्स एकमात्र वितरण नहीं है जिसे 'प्लेटफ़ॉर्म' का पता नहीं लगाया जा सकता है। अमेज़ॅन लिनक्स का भी एक खाली ट्यूपल में परिणाम मिलता है। –

1

यह 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

यह आर्क लिनक्स के तहत काम करता है;) – nachopro

+1

अच्छा विचार नहीं है, '/ etc/issue' मानक कंसोल पर शो स्वागत लाइन के लिए है और अक्सर उपयोगकर्ता/व्यवस्थापक द्वारा संशोधित किया जाता है। आधुनिक डिस्ट्रो का पता लगाने का मानक तरीका पार्स '/ etc/lsb-release' या बेहतर'/etc/os-release' है –

0

अजगर 2 ठीक से आर्क लिनक्स नहीं पहचानता है। यह अजगर 3.3+ में तय किया गया है, लेकिन अजगर 2. करने के लिए कभी नहीं वापस पोर्ट किया गया यहाँ आधिकारिक बग रिपोर्ट के एक जोड़े हैं:

https://bugs.python.org/issue20454
https://bugs.python.org/issue11678

अजगर 2 में इस मुद्दे का संभावित हल काफी है सरल। इसलिए यह एक संस्करण या id नहीं है,

>>> import platform 
>>> platform.linux_distribution(supported_dists=platform._supported_dists + ('arch',)) 
('arch', '', '') 

नोट आर्क लिनक्स एक रोलिंग रिलीज है कि: तुम बस मंच मॉड्यूल है कि "कट्टर" एक समर्थित वितरण है बताने के लिए की जरूरत है।

supported_dists तर्क here प्रलेखित है, हालांकि मैं प्रलेखन बहुत स्पष्ट नहीं मिल रहा है। आप _supported_dists को ओवरराइट नहीं करना चाहते हैं क्योंकि तब आपका कोड केवल आर्क लिनक्स पर काम करेगा। आप टुपल में जोड़ना चाहते हैं।

वास्तव में, यदि आप platform._supported_dists के मान को प्रिंट करते हैं, तो आप देखेंगे कि पायथन 2.7.12 और पायथन 3.5.1 के बीच एकमात्र अंतर ('arch', 'mageia') के अतिरिक्त है। मजेदार तथ्य: आप अमेज़ॅन लिनक्स पर प्लेटफार्म पहचान के लिए 'system' भी जोड़ सकते हैं।

2

कारण है जिसकी वजह से platform.linux_distribution कुछ वितरण की पहचान नहीं करता क्योंकि गैर मानकीकृत तरीका वितरण स्वयं पर संस्करण से संबंधित जानकारी प्रदान की है।

मैं एक पैकेज distro कहा जाता है (अब pip द्वारा प्रयोग किया जाता है), जो distro.linux_distribution को बदलने के लिए करना है लिखा है। यह कई वितरणों पर काम करता है जो platform का उपयोग करते समय अजीब या खाली tuples वापस कर सकते हैं।

https://github.com/nir0s/distro (distro, pypi पर)

यह वितरण से संबंधित जानकारी प्राप्त करने के लिए अधिक विस्तृत एपीआई प्रदान करता है।

$ 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 अजगर 3.7 में हटाया जा रहा है।

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