2013-02-13 87 views
2

考慮以下用途:Python的argparse:既可選和位置值參數

usage: do.py [-h] [-s | -m] filename 

這不是完整的使用情況。但我想有效地爲filename是文件,而不是的實際值:

--filename FILENAME 

而且,filename應該是可選的,所以我可以從標準輸入讀取。考慮一下UNIX上的cat程序。

你乾脆說:

cat filename 

OR

cat 

編輯:現在,如果我執行程序do.py沒有任何命令行選項,我會得到一個error: too few arguments。相反,即使我沒有給它一個有效的filename,我仍然希望它執行。我怎麼做?

+1

這些都很好看,如果有點光,規格。什麼是問題?請編輯您帖子的正文以包含您的解決方案嘗試,並且人們會指引您朝正確的方向發展。謝謝。 – bernie 2013-02-13 00:17:20

+0

現在,如果我執行沒有任何命令行選項的程序do.py,我會得到一個錯誤:參數太少。相反,我仍然希望它執行,即使我沒有文件名。 – p0lAris 2013-02-13 00:19:08

+0

required = False不適用於定位。 – p0lAris 2013-02-13 00:25:59

回答

5

更新2:從ArgParse文檔,

One of the more common uses of nargs='?' is to allow optional input and output files:

>>> parser = argparse.ArgumentParser() 
>>> parser.add_argument('infile', nargs='?', type=argparse.FileType('r'), 
...      default=sys.stdin) 
>>> parser.add_argument('outfile', nargs='?', type=argparse.FileType('w'), 
...      default=sys.stdout) 
>>> parser.parse_args(['input.txt', 'output.txt']) 
Namespace(infile=<open file 'input.txt', mode 'r' at 0x...>, 
      outfile=<open file 'output.txt', mode 'w' at 0x...>) 
>>> parser.parse_args([]) 
Namespace(infile=<open file '<stdin>', mode 'r' at 0x...>, 
      outfile=<open file '<stdout>', mode 'w' at 0x...>) 

原來的答覆:

這很簡單:只需添加一個位置參數有一個默認值和nargs='*'。如果存在零參數的默認值將被使用,否則將被用於在命令行上的參數:

>>> p = argparse.ArgumentParser() 
>>> p.add_argument('filename', nargs='*', default=['-']) 
>>> p.parse_args([]) 
Namespace(filename=['-']) 
>>> p.parse_args(['abc']) 
Namespace(filename=['abc']) 

通常,-被用來指標準輸入/輸出標準。

然後,你做這樣的事情:

def get_inputs(ns): 
    """Iterate over input files.""" 
    for path in ns.filename: 
     if path == '-': 
      yield sys.stdin 
     else: 
      yield open(path, 'r') 

更新:我假設你想要多個文件名,因爲cat需要多個文件名。如果您想要零個或一個文件名,您可以使用nargs='?'

+0

這是正確的先生。我實際上在文檔中使用了nargs選項。我不想要的是用戶看到這個: 用法:do.py [-h] [-s | -m] [文件名[文件名...]] 他應該只能真正看到該文件名是可選的,只有一個值是可能的。 – p0lAris 2013-02-13 00:23:34

+0

這將是'nargs ='?''爲零或一個位置;見http://docs.python.org/dev/library/argparse.html#nargs – msw 2013-02-13 00:25:36

+0

@ flippex17:當你說你在文檔中看到'nargs'選項時,我很難相信你......因爲你肯定會看到'''''如果你一直在看文檔... – 2013-02-13 00:25:50

相關問題