2009-06-11 12 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) 

Questa è una porzione di codice su cui sto lavorando. La prima parte che sto cercando di dire se l'utente non digita python programname something allora uscirà.python e sys.argv

La seconda parte che sto cercando di verificare se il database esiste. In entrambi i casi non sono sicuro di avere il modo corretto di scrivere sys.argv di stderr o meno.

+3

Questo dovrebbe essere chiamato "Python e sys.stderr", tho in realtà mi ha aiutato sul 'argv': P – cregox

+0

Esattamente lo stesso cosa mi è successo, @Cawas – Stedy

+0

Nel tuo primo blocco di stampa if '' Uso: '+ sys.argv [0] 'non dice all'utente che è necessario digitare" python [programma \ _nome] [qualcosa] " . Stampa solo "Usage: [program \ _name]". Potresti voler creare un messaggio di errore migliore. – ntownsend

risposta

90

BTW si può passare il messaggio di errore direttamente 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

In Python, non è possibile incorporare espressioni Python arbitrarie in stringhe letterali e sostituirle con il valore della stringa. È necessario uno:

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

o

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

Inoltre, si può prendere in considerazione utilizzando la seguente sintassi di print (per Python precedenti alla 3.x):

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

L'utilizzo di print rende il codice più semplice da leggere. Python aggiunge automaticamente uno spazio tra gli argomenti all'istruzione print, quindi ci sarà uno spazio dopo i due punti nell'esempio precedente.

In Python 3.x, si può usare la funzione print:

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

Infine, in Python 2.6 e versioni successive è possibile utilizzare .format:

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

Si noti che 'Uso: {0}'. Format (sys.argv [0]) è ora il modo consigliato per formattare le stringhe. –

+0

Grazie, ha aggiunto. –

+4

Nota inoltre che sys.stderr.write() non aggiungerà una nuova riga finale, quindi dovresti includerne una esplicitamente. –

30

lo farei in questo modo:

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)) 

Ciò consente di importare main() in altri moduli, se lo si desidera, e semplifica il debug perché è possibile scegliere cosa dovrebbe essere argv.

+0

Questa è una bella spiegazione: stavo cercando ulteriori informazioni sull'uso di sys.exit (main (sys.argv)) e del motivo per cui è stato incoraggiato. Grazie per la spiegazione. –