2012-03-23 12 views
6

Ho iniziato un serio tentativo di imparare alcuni Python come il mio primo linguaggio di programmazione con alcune conoscenze di base sugli algoritmi. Poiché tutti raccomandano che il modo migliore per iniziare sia trovare qualcosa di utile da fare, ho deciso di fare un piccolo script per gestire i miei repository.python - principiante - integrazione di optparse in un programma

cose di base: - Attiva/Disattiva YUM repository - Cambia priorità sul repository YUM attuali - Aggiungi/Rimuovi repository

Mentre l'analisi del file e sostituire/aggiungere/rimuovere i dati è molto semplice, io sono lottando (principalmente con forse mancanza di conoscenza) con una sola cosa con 'optparse' ... Voglio aggiungere a un'opzione (-l) che elenca gli attuali repository disponibili ... Ho fatto una semplice funzione che fa questo lavoro (non qualcosa di molto elaborato), ma non riesco a 'collegarlo' con '-l' su optparse. Chiunque potrebbe fornire esempi/suggerimenti su come farlo?

Lo script corrente è qualcosa di simile:

#!/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() 

Eventuali suggerimenti per migliorare (documenti, esempi) sono i benvenuti. L'obiettivo principale ancora una volta, è che quando eseguo script.py -l può essere eseguito list_my_repos().

+0

Dovresti usare 'argparse' quando possibile -' Il modulo optparse è deprecato e non verrà ulteriormente sviluppato; lo sviluppo continuerà con il modulo argparse. – Daenyth

risposta

6

opzioni di analisi utilizzando optparse è sempre stato piuttosto opaco a me. Usare argparse aiuta un po '.

L'intuizione che ritengo possa aiutare è che il modulo optparse in realtà non aiuta a eseguire le azioni specificate sulla riga di comando. Piuttosto, ti aiuta a raccogliere informazioni dagli argomenti della riga di comando, su cui puoi agire in seguito.

In questo caso, le informazioni che state raccogliendo viene memorizzato nella tupla (options, args) nella vostra linea:

(options, args) = parser.parse_args() 

Per agire in realtà su queste informazioni, si sta andando ad avere a che fare il proprio controllo in il tuo codice. Mi piace mettere cose come questa in un blocco alla fine del mio programma, which will only run if it is called from the command line.

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

Per rendere come funziona un po 'più chiaro, aiuta a rendersi conto che si potrebbe fare la stessa cosa senza optparse a tutti, utilizzando sys.argv.

import sys 

if __name__ == '__main__': 
    if sys.argv[1] == '-l': 
     list_my_repos() 

come si può vedere, tuttavia, questa sarebbe un'implementazione molto fragile. Essere in grado di gestire casi più complessi senza fare troppa parte della propria programmazione è ciò che acquista optparse/argparse.

3

Non si utilizza la flag -l nel codice. La documentazione mostra come verificare se il flag è presente. http://docs.python.org/library/optparse.html

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

ha fatto il trucco insieme all'esempio di Panthr. – nmarques

5

Prima di tutto, il optparse docs dicono che la biblioteca è deprecato, e si dovrebbe utilizzare argparse invece. Allora, facciamo che:

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 

Buona fortuna apprendimento Python :)

+0

Roba buona, ma sfortunatamente sono su Python 2.6 (RHEL6). Darò un tocco in seguito su una scatola openSUSE con python 2.7. – nmarques

Problemi correlati