2012-02-25 13 views
9
from sys import argv 
script, lira_cbt, [eur_hedge] = argv 

if eur_hedge == None: 
    #Do x 
else: 
    #Do y 

Quiero que se pueda ejecutar con solo lira_cbt como argumento (haciendo x), o con lira_cbt y eur_hedge (haciendo y). ¿Se puede lograr esto con sys.argv?¿Puede sys.argv manejar argumentos opcionales?

+1

Si su CLI consigue ese complejo, probablemente debería empezar a usar 'argparse' (o' optparse' si estás atascado con alguna versión antigua). – delnan

Respuesta

15

sólo tiene que utilizar la longitud de sys.argv

if len(sys.argv) == 2: 
    # do X 
else: 
    # do Y 
2

Puede simplemente verificar la longitud de sys.argv.

if len(sys.argv) < 2: 
    # Error, not enough arguments 

lira_cbt = sys.argv[1] 
if len(sys.argv) == 2: 
    # Do X 
else: 
    eur_hedge = sys.argv[2] 
    # Do Y 
+0

¿Pero no hay forma de extraer específicamente el valor en eur_hedge sin arrojar una necesidad más/demasiadas variables para descomprimir el argumento? – Felix

+2

No, no hay forma de hacerlo, a menos que desee convertirlo en una llamada a función y usar algo como 'def main (script, lira_cbt, eur_hedge = None)' y 'main (* sys.argv)', que Definitivamente no lo haría. –

1

Otra opción es extraer los valores de la lista argv usando try:

lira_cbt = sys.argv[1] 
try: 
    eur_hedge = sys.argv[2] 
except IndexError: 
    eur_hedge = None 

if eur_hedge == None: 
    # Do X 
else: 
    # Do Y 

También puede echar un vistazo a getopt de un analizador más flexible de argumentos de línea de comando.

+2

¡optparse o argparse sería mucho mejor que getopt! – carl

5

Si esto es ser parte de más de una secuencia de comandos de usar y tirar, considerar el uso de argparse http://docs.python.org/library/argparse.html

En el momento en que va a ser mucho más complicado, pero le ayudará a mantener documentado las opciones de su programa acepta y también proporciona mensajes de error útiles a diferencia de "demasiados valores para descomprimir" que el usuario podría no comprender.

0

Si puedo sugerir un enfoque alternativo:

from sys import argv 
option_handle_list = ['--script', '--lira_cbt', '--eur_hedge'] 
options = {} 
for option_handle in option_handle_list: 
    options[option_handle[2:]] = argv[argv.index(option_handle) + 1] if option_handle in argv else None 
if options['eur_hedge'] == None: 
    #Do x 
else: 
    #Do y 
+0

Si bien esto puede funcionar, usar un módulo como 'argparse' para esta tarea sería más fácil y más pitónico. – YSelf

+0

@YSelf No estoy debatiendo sobre la solución más fácil/más tradicional. Solo respondiendo la pregunta original. –

Cuestiones relacionadas