2013-02-21 42 views
0

我測試了一些argparse代碼。我想要有一個可選的參數,它從選項列表中收集數量爲n的輸入。所以,我寫道:用argparse殺死解釋器

import argparse 

modules = ["geo", "loc"] 
parser = argparse.ArgumentParser() 
parser.add_argument("--modules", nargs='*', choices=modules) 

有了這個設置,我可靠地完全殺死了解釋器。

如果你通過一個有效的組參數,它工作正常:

>>> parser.parse_args("--module geo loc geo".split()) 
Namespace(modules=['geo', 'loc', 'geo']) 

但是,如果你在想念形成參數傳遞,它殺死蟒蛇完全:

>>> parser.parse_args("--module geo metro".split()) 
usage: [-h] [--modules [{geo,loc} [{geo,loc} ...]]] 
: error: argument --modules: invalid choice: 'metro' (choose from 'geo', 'loc') 
PS C:\Users\myname\mycode> 

我的問題是兩摺疊:

  1. 這是預期的行爲?如果是這樣,這是什麼原因?
  2. 使用這段代碼我會好嗎,因爲我不介意我的程序是否死於錯誤的參數?還是有一些令人信服的理由來避免這種情況?

作爲一個說明,我使用的Windows 7

+0

'parser_args'調用一些調用'sys.exit'的'error'函數。這就是你得到這種行爲的原因。 – mmgp 2013-02-21 23:19:18

回答

3
  1. 是的,這是預期的,並記載:

    在解析命令行,parse_args()檢查的各種錯誤,包括曖昧選項,無效類型,無效選項,錯誤數位置參數等。當它遇到這樣的錯誤時,它退出並將錯誤與用法消息一起打印出來:

    這個想法是,如果用戶給出了一個無效的選項或參數知道如何處理,我最好的選擇放棄而不是第二次猜測用戶的真實意圖。

  2. 如果你不介意,那麼它應該沒問題吧?除非您知道實現不同行爲的原因,否則您的程序與所有平臺上的所有行爲良好的命令行工具完全一致。

如果你想實現不同的行爲,趕上SystemExit異常parse_args可能提高。 (我唯一能想到的程序的行爲與我剛剛描述的方式有所不同,就是版本控制工具Git,它試圖猜測用戶的意思並打印它的猜測,但它仍然會退出。 )

1

​​Python2.7當你的Python腳本是由命令行運行是專爲使用。這就是無效論據導致程序退出的原因。

此行爲幾乎與所有shell(bash/sh/dos/etc)實用程序一致。無效的命令行參數會導致程序退出時顯示錯誤字符串和(可選)使用情況消息。