2009-06-11 15 views
56
if len(sys.argv) < 2: 
    sys.stderr.write('Usage: sys.argv[0] ') 
    sys.exit(1) 


if not os.path.exists(sys.argv[1]): 
    sys.stderr.write('ERROR: Database sys.argv[1] was not found!') 
    sys.exit(1) 

Esta es una parte del código en el que estoy trabajando. La primera parte que trato de decir si el usuario no escribe python programname something, entonces saldrá.python y sys.argv

La segunda parte estoy tratando de ver si existe la base de datos. En ambos lugares no estoy seguro si tengo la forma correcta de escribir los sys.argv's por stderr o no.

+3

Esto debería ser llamado "Python y sys.stderr", aunque en realidad me ayudó en la 'argv': P – cregox

+0

Exactamente el mismo me pasó a mí, @Cawas – Stedy

+0

En su primer bloque if haciendo de impresión ' 'Uso:' + sys.argv [0]' no le dice al usuario que tienen que escribir "pitón [programa \ _name] [algo]" . Solo imprime "Uso: [programa \ _nombre]". Es posible que desee obtener un mejor mensaje de error. – ntownsend

Respuesta

90

Por cierto que puede pasar el mensaje de error directamente a sys.exit:

if len(sys.argv) < 2: 
    sys.exit('Usage: %s database-name' % sys.argv[0]) 

if not os.path.exists(sys.argv[1]): 
    sys.exit('ERROR: Database %s was not found!' % sys.argv[1]) 
34

En Python, que no sólo puede incrustar expresiones arbitrarias de Python en cadenas literales y tienen que sustituir el valor de la cadena. Es necesario que sea:

sys.stderr.write("Usage: " + sys.argv[0]) 

o

sys.stderr.write("Usage: %s" % sys.argv[0]) 

Además, es posible que desee considerar el uso de la siguiente sintaxis de print (para Python antes de lo 3.x):

print >>sys.stderr, "Usage:", sys.argv[0] 

El uso de print hace que el código sea más fácil de leer. Python agrega automáticamente un espacio entre argumentos a la declaración print, por lo que habrá un espacio después de los dos puntos en el ejemplo anterior.

En Python 3.x, deberá utilizar la función print:

print("Usage:", sys.argv[0], file=sys.stderr) 

Por último, en Python 2.6 y posterior puede utilizar .format:

print >>sys.stderr, "Usage: {0}".format(sys.argv[0]) 
+9

Tenga en cuenta que el formato 'Uso: {0}'. (Sys.argv [0]) es ahora la forma recomendada de formatear cadenas. –

+0

Gracias, agregó que. –

+4

También tenga en cuenta que sys.stderr.write() no agregará una nueva línea final, por lo que debe incluir una explícitamente. –

30

lo haría de esta manera:

import sys 

def main(argv): 
    if len(argv) < 2: 
     sys.stderr.write("Usage: %s <database>" % (argv[0],)) 
     return 1 

    if not os.path.exists(argv[1]): 
     sys.stderr.write("ERROR: Database %r was not found!" % (argv[1],)) 
     return 1 

if __name__ == "__main__": 
    sys.exit(main(sys.argv)) 

Esto permite main() para ser importado en otros módulos, si lo desea, y simplifica la depuración porque puede elegir qué debería ser argv.

+0

Esta es una buena explicación: estaba buscando más información sobre el uso de sys.exit (main (sys.argv)) y por qué se fomentó. Gracias por la explicación. –