2012-03-23 14 views
6

He comenzado un serio intento de aprender algo de Python como mi primer lenguaje de programación con algunos conocimientos básicos sobre algoritmos. Como todos recomiendan que la mejor manera de comenzar es encontrar algo útil que hacer, he decidido hacer un pequeño script para administrar mis repositorios.python - beginner - integrando optparse en un programa

cosas básicas: - Habilitar repositorios/Desactivar YUM - Cambiar prioridad en los repositorios YUM actuales - Añadir/Quitar repositorios

Si bien el análisis del archivo y sustituir/añadir/eliminar los datos es muy simple, yo soy luchando (principalmente con tal vez falta de conocimiento) con una sola cosa con 'optparse' ... Quiero agregar a una opción (-l) que enumera los repositorios disponibles actualmente ... He hecho una función simple que hace esto trabajo (no es algo muy elaborado), pero no puedo 'conectarlo' con '-l' en optparse. ¿Alguien podría proporcionar ejemplos/sugerencias sobre cómo hacer esto?

El script actual es algo como esto:

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

alguna sugerencia para mejorar (documentos, hojas de ejemplos) son bienvenidos. El objetivo principal una vez más, es que cuando ejecuto script.py -l puede ejecutar list_my_repos().

+0

Debe usar 'argparse' cuando sea posible -' El módulo optparse está en desuso y no se desarrollará más; el desarrollo continuará con el módulo argparse. – Daenyth

Respuesta

6

opciones de análisis sintáctico utilizando optparse siempre ha sido más bien opaco a mí. Usar argparse ayuda un poco.

La idea que creo que ayudará es que el módulo optparse en realidad no lo ayuda a realizar las acciones especificadas en la línea de comandos. Más bien, le ayuda a recopilar información de los argumentos de la línea de comandos, sobre los cuales puede actuar más adelante.

En este caso, la información que está recogiendo se almacena en la tupla (options, args) en su línea:

(options, args) = parser.parse_args() 

Actuar en realidad en esta información, vamos a tener que hacer su propia comprobación de tu codigo. Me gusta poner cosas como esta en un bloque al final de mi programa, which will only run if it is called from the command line.

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

Haciendo cómo funciona esto un poco más claro, ayuda a darse cuenta de que se podría hacer lo mismo sin optparse en absoluto, mediante el uso de sys.argv.

import sys 

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

como probablemente pueda ver, sin embargo, esta sería una implementación muy frágil. Ser capaz de manejar casos más complejos sin hacer demasiado de su propia programación es lo que optparse/argparse le compra.

3

No está utilizando el distintivo -l en su código. La documentación muestra cómo verificar para ver si la bandera está presente. http://docs.python.org/library/optparse.html

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

hizo el truco junto con el ejemplo de Panthr. – nmarques

5

En primer lugar, la optparse docs dicen que la biblioteca está en desuso, y se debe utilizar en lugar argparse. Así que vamos a hacer eso:

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 

Buena suerte :) aprender Python

+0

Lo bueno, pero desafortunadamente estoy en Python 2.6 (RHEL6). Voy a darle una oportunidad más tarde en una caja de openSUSE con Python 2.7. – nmarques