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

這是我正在處理的代碼的一部分。我試圖說的第一部分,如果用戶不鍵入python programname something那麼它將退出。python和sys.argv

第二部分我試圖看看數據庫是否存在。在這兩個地方,我不確定我是否有正確的方式來寫出sys.argv的stderr或不是。

+3

這應該被稱爲「蟒蛇和sys.stderr」,壽它實際上幫了我的`argv`:P – cregox 2010-04-13 21:49:00

+0

完全一樣發生在我身上的事情,@Cawas – Stedy 2010-04-28 23:25:15

+0

在你的第一個if-block打印`'用法:'+ sys.argv [0]`不告訴用戶他們需要輸入「python [program \ _name] [something]」 。它只打印「用法:[program \ _name]」。您可能想要提供更好的錯誤消息。 – ntownsend 2009-06-11 19:57:02

回答

90

順便說一句,你可以直接傳遞錯誤消息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

在Python中,您不能只是將任意的Python表達式嵌入到文字字符串中,並將其替換爲字符串的值。您需要:

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

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

而且,你可能要考慮使用的print以下語法(對於Python早於3.X):

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

使用print可以說使代碼更易於閱讀。 Python自動在print語句的參數之間添加一個空格,所以在上面的例子中,冒號後面會有一個空格。

在Python 3.x中,您將使用print功能:

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

最後,在Python 2.6和更高版本可以使用.format

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

我會做這種方式:

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

這允許導入main()進入其他模塊,如果需要,可以簡化調試,因爲您可以選擇argv應該是什麼。