2011-12-08 16 views
8

टीएलडीआर; मुझे एक पाइथन कॉल की आवश्यकता है जिसे पैकेज नाम दिया गया है (उदाहरण के लिए, 'मेक') यह देखने के लिए कि यह इंस्टॉल है या नहीं; यदि नहीं, तो इसे स्थापित करें (मैं बाद वाला हिस्सा कर सकता हूं)।निर्धारित करें कि यम पायथन एपीआई के साथ पैकेज स्थापित है या नहीं?

समस्या:

तो वहाँ कुछ कोड http://yum.baseurl.org/wiki/YumCodeSnippets में दिये गये उदाहरण है, लेकिन IPython के अंदर चारों ओर kludging और क्या प्रत्येक विधि करता है पर अनुमान लगा के अलावा अन्य, वहाँ के लिए कोई वास्तविक प्रलेखन होने के लिए प्रकट नहीं होता हैं यम के लिए पायथन एपीआई। यह स्पष्ट रूप से सभी जनजातीय ज्ञान है।

[संपादित करें] जाहिर है मैं तो बस गलती से API दस्तावेज़ की खोज (बेशक, एक स्वीकार्य जवाब मिलने के बाद)। यह मुख्य पृष्ठ से लिंक नहीं है, लेकिन यहाँ यह भविष्य में संदर्भ के लिए है: http://yum.baseurl.org/api/yum/

मैं क्या करने की जरूरत:

मैं एक तैनाती विन्यास स्क्रिप्ट है कि अन्य प्रणाली संकुल पर निर्भर करता है है (बनाने के लिए, जीसीसी, आदि।)। मुझे पता है कि मैं उन्हें इस तरह स्थापित कर सकता हूं: http://yum.baseurl.org/wiki/YumCodeSnippet/SimplestTransaction लेकिन मुझे यह पूछने का विकल्प होना चाहिए कि वे ऐसा करने से पहले पहले से इंस्टॉल हैं या नहीं, इसलिए मेरे पास पैकेज विफल होने के बजाय बस विफल होने का अतिरिक्त विकल्प हो सकता है स्थापना मजबूर कर रहा है। ऐसा करने के लिए उचित कॉल क्या है (या बेहतर, क्या किसी ने वास्तव में कोड नमूने के बाहर एपीआई को सही तरीके से दस्तावेज करने के लिए परेशान किया है?)

मैंने इस परियोजना से पहले पायथन को कभी नहीं छुआ है, और मुझे वास्तव में यह पसंद है, लेकिन ... मॉड्यूल प्रलेखन में से कुछ यूनिकॉर्न-सवारी लेप्रचान की तुलना में अधिक छिपी हुई है।

+1

क्या आपने लिंक किए गए वेब पेज से 'यमशर्च' स्निपेट की कोशिश की है? –

+0

हाँ, लेकिन इसके परिणाम मुझे स्थापित स्थिति का कोई संकेत नहीं दे रहे थे - बस आरपीएमडीबी पैकेज के बारे में जानता था या नहीं (निर्दिष्ट फ़ील्ड के आंशिक पाठ मिलान के आधार पर)। शायद मैं इसे गलत कर रहा हूँ। –

उत्तर

17
import yum 

yb = yum.YumBase() 
if yb.rpmdb.searchNevra(name='make'): 
    print "installed" 
else: 
    print "not installed" 
+0

धन्यवाद देता है; मुझे पता था कि यह कुछ आसान होना था। मैंने सैनिटी की जांच की और यह सब अच्छा लग रहा है! –

1

आप चला सकते हैं 'जो' सबसिस्टम पर अगर प्रणाली बाइनरी आप देख रहे हैं देखने के लिए:

import os 
os.system("which gcc") 
os.system("which obscurepackagenotgoingtobefound") 
+0

मैं यह निर्धारित करने के लिए करता हूं कि मेरा उत्पाद पहले से स्थापित है या नहीं (यानी, अपग्रेड परिदृश्य), हालांकि मैं एक और "शुद्ध" पायथन दृष्टिकोण की उम्मीद कर रहा था। 'कौन सा दृष्टिकोण निश्चित रूप से काम करेगा, लेकिन यह एक सीखने का अभ्यास है क्योंकि यह एक व्यावहारिक है। : संपादित करें: मैं इसे ठीक से प्रारूपित नहीं कर सकता, लेकिन इस तरह मैं इसे devnull = open (os.devnull, "w") ret = subprocess.call (["which", "myapp "], stdout = devnull, stderr = subprocess.STDOUT, shell = True) devnull.close() # वापसी कोड 0 (सफलता) है यदि" जो "" myapp "मिला है; अन्यथा यह 1 (नहीं मिला) –

1

किसी को भी जो इस पोस्ट बाद में भर में ठोकर के लिए, यहाँ है कि मैं क्या आया साथ में। ध्यान दें कि "परीक्षण" और "skip_install" झंडे हैं जिन्हें मैं स्क्रिप्ट आमंत्रण से पार्स करता हूं।

print "Checking for prerequisites (Apache, PHP + PHP development, autoconf, make, gcc)" 
    prereqs = list("httpd", "php", "php-devel", "autoconf", "make", "gcc") 

    missing_packages = set() 
    for package in prereqs: 
     print "Checking for {0}... ".format([package]), 

     # Search the RPM database to check if the package is installed 
     res = yb.rpmdb.searchNevra(name=package) 
     if res: 
      for pkg in res: 
       print pkg, "installed!" 
     else: 
      missing_packages.add(package) 
      print package, "not installed!" 
      # Install the package if missing 
      if not skip_install: 
       if testing: 
        print "TEST- mock install ", package 
       else: 
        try: 
         yb.install(name=package) 
        except yum.Errors.InstallError, err: 
         print >> sys.stderr, "Failed during install of {0} package!".format(package) 
         print >> sys.stderr, str(err) 
         sys.exit(1) 

    # Done processing all package requirements, resolve dependencies and finalize transaction 
    if len(missing_packages) > 0: 
     if skip_install: 
      # Package not installed and set to not install, so fail 
      print >> sys.stderr, "Please install the {0} packages and try again.".format(
       ",".join(str(name) for name in missing_packages)) 
      sys.exit(1) 
     else: 
      if testing: 
       print "TEST- mock resolve deps and process transaction" 
      else: 
       yb.resolveDeps() 
       yb.processTransaction()