2012-03-23 22 views
6

Bazı Python'ları algoritmalarla ilgili temel bilgilere sahip ilk programlama dilimi olarak öğrenmeye ciddi bir girişimde bulundum. Herkesin başlamanın en iyi yolunun yararlı bir şey bulmak olduğunu tavsiye ettiği için, depolarımı yönetmek için küçük bir betik yapmaya karar verdim.python - acemi - bir programda optparse'ı entegre etme

Temel şeyler: - Ben, veri oldukça basittir ekleme/kaldırma/dosya ayrıştırma iken depoları

Ekle/Kaldır ve değiştirme - Geçerli YUM depoları değiştirme önceliğini -/devre dışı bırak YUM depoları etkinleştirme 'optparse' ile tek bir şeyle mücadele (çoğunlukla bilgi eksikliği) mücadele ... Mevcut mevcut depoları listeleyen bir seçenek (-l) eklemek istiyorum ... Bunu yapan basit bir işlev yaptım iş (çok ayrıntılı bir şey değil), ama optparse'de '-l' ile 'bağlayamıyorum'. Bunu nasıl yapacaklarına dair örnekler/öneriler sunabilir mi?

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import os 
import sys 
import optparse 
import ConfigParse 

repo_file = "/home/nmarques/my_repos.repo" 

parser = optparse.OptionParser() 
parser.add_option("-e", dest="repository", help="Enable YUM repository") 
parser.add_option("-d", dest="repository", help="Disable YUM repository") 
parser.add_option("-l", dest="list", help="Display list of repositories", action="store_true") 
(options, args) = parser.parse_args() 

def list_my_repos() 
    # check if repository file exists, read repositories, print and exit 
    if os.path.exists(repo_file): 
     config = ConfigParser.RawConfigParser() 
     config.read(repo_file) 
     print "Found the following YUM repositories on " + os.path.basename(repo_file) + ":" 
     for i in config.sections(): 
      print i 
     sys.exit(0) 
    # otherwise exit with code 4 
    else: 
     print "Main repository configuration (" + repo_file +") file not found!" 
     sys.exit(4) 

list_my_repos() 

herhangi bir öneriniz (dokümanlar, örnekler) geliştirmek için en bekliyoruz:

akım komut dosyası aşağıdaki gibi bir şeydir. Ana hedef bir kez daha, script.py -l'u çalıştırdığımda list_my_repos() çalıştırabilir.

+0

Mümkün olduğunda 'argparse 'kullanmalısınız -' Optparse modülü kullanımdan kaldırılmıştır ve daha fazla geliştirilmeyecektir; geliştirme argparse modülü ile devam edecek.' – Daenyth

cevap

6

Ayrıştırma seçenekleri öğrenme bana hep oldukça opak olmuştur. argparse'un kullanılması biraz yardımcı olur.

Yardımcı olacağını düşündüğüm fikir, optparse modülünün aslında komut satırında belirtilen eylemleri gerçekleştirmenize yardımcı olmamasıdır. Aksine, daha sonra hareket edebileceğiniz komut satırı argümanlarından bilgi toplamanıza yardımcı olur. Bu durumda

, sen topluyorsunuz bilgiler doğrultusunda tuple (options, args) depolanır:

(options, args) = parser.parse_args() 

aslında bu bilgilere göre hareket etmek , sen kendi kontrolünü yapmak zorunda gidiyoruz senin kodun. Programın sonunda, which will only run if it is called from the command line'un bir bloğu gibi şeyler koymak istiyorum. Bu biraz daha açık nasıl çalıştığını

if __name__ == '__main__': 
    if options.list: 
     list_my_repos() 

yapmak için, size sys.argv kullanarak, hiç optparse olmadan aynı şeyi yapabileceğini gerçekleştirmek için yardımcı olur. Muhtemelen görebileceğiniz gibi, muhtemelen çok kırılgan bir uygulama olacaktır. Kendi programlamanızı çok fazla yapmadan daha karmaşık vakaları ele alabilmek, optparse/ argparse'un sizi satın almasıdır.

3

Kodunuzda -l bayrağını kullanmıyorsunuz. Bu belgede, bayrağın bulunup bulunmadığını görmek için nasıl kontrol edileceğini gösterir. http://docs.python.org/library/optparse.html

(options, args) = parser.parse_args() 
if options.list: 
    list_my_repos() 
    return 
+0

, Panthr'ın örneğiyle birlikte hile yaptı. – nmarques

5

İlk kapalı, optparse docs kütüphane itiraz edildi söylemek ve bunun yerine argparse kullanmalıdır. Yani bunu yapalım:

import argparse 

parser = argparse.ArgumentParser() #Basic setup 
parser.add_argument('-l', action='store_true') #Tell the parser to look for "-l" 
#The action='store_true' tells the parser to set the value to True if there's 
#no value attached to it 
args = parser.parse_args() #This gives us a list of all the arguments 
#Passing the args -l will give you a namespace with "l" equal to True 

if args.l: #If the -l argument is there 
    print 'Do stuff!' #Go crazy 

İyi şanslar optparse kullanarak Python'un :)

+0

İyi şeyler, ama ne yazık ki ben python 2.6 (RHEL6). Ben python 2.7 ile bir openSUSE kutusunda daha sonra bir vereceğim. – nmarques

İlgili konular