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

To część kodu, nad którym pracuję. Pierwsza część Próbuję powiedzieć, że jeśli użytkownik nie wpisać python programname something to będzie wyjść.python i sys.argv

Druga część Próbuję sprawdzić, czy baza danych istnieje. W obu miejscach nie jestem pewien, czy mam prawidłowy sposób zapisu sys.argv przez stderr czy nie.

+3

ten powinien być o nazwie „Python i sys.stderr”, pomimo, że faktycznie pomógł mi na 'argv': P – cregox

+0

dokładnie w tym samym coś mi się stało, @Cawas – Stedy

+0

w pierwszym bloku, jeśli robi print '„Zastosowanie:”+ sys.argv [0]' nie poinformować użytkownika, że ​​trzeba wpisać „python [Program \ _name] [coś]” . Wypisuje tylko "Usage: [program \ _name]". Możesz wymyślić lepszy komunikat o błędzie. – ntownsend

Odpowiedz

90

BTW można przekazać komunikat o błędzie bezpośrednio do 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

W Pythonie, nie można po prostu umieścić dowolne wyrażenia Pythona do dosłownych ciągi i mieć go zastąpić wartość ciągu. Musisz albo:

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

lub

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

Ponadto, może warto rozważyć przy użyciu następującej składni print (dla Pythona wcześniej niż 3.x):

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

Korzystanie z print prawdopodobnie powoduje, że kod jest łatwiejszy do odczytania. Python automatycznie dodaje spację pomiędzy argumentami do rachunku print, więc nie będzie jedno miejsce po dwukropku w powyższym przykładzie.

w Pythonie 3.x, należy użyć print funkcję:

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

Wreszcie w Pythonie 2.6 i później można użyć .format:

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

Należy zauważyć, że format "Usage: {0}". (Sys.argv [0]) jest teraz zalecanym sposobem formatowania ciągów. –

+0

Dzięki, dodał. –

+4

Należy również zauważyć, że sys.stderr.write() nie doda dodającego znaku nowej linii, więc należy go jawnie dołączyć. –

30

chciałbym zrobić to w ten sposób:

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

Pozwala to na zaimportowanie main() do innych modułów, jeśli jest to pożądane, i ułatwia debugowanie, ponieważ można wybierać co argv powinno być.

+0

To jest ładne wyjaśnienie - szukałem więcej informacji na temat korzystania z sys.exit (main (sys.argv)) i dlaczego było to zalecane. Dziękuję za wyjaśnienie. –