2011-09-27 64 views
45

我發現非常有用的語法可選標準輸入與argparse

parser.add_argument('-i', '--input-file', type=argparse.FileType('r'), default='-') 

用於指定輸入文件或使用標準輸入,這兩個我想在我的程序。但是,輸入文件並不總是必需的。如果我不使用-i或與

$ someprog | my_python_prog 
$ my_python_prog < inputfile 

一個重定向輸入我不希望我的Python程序等待輸入。我希望它只是移動並使用默認值。

回答

74

標準庫documentation for argparse表明該解決方案允許可選的輸入/輸出文件:

>>> 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=<_io.TextIOWrapper name='input.txt' encoding='UTF-8'>, 
      outfile=<_io.TextIOWrapper name='output.txt' encoding='UTF-8'>) 
>>> parser.parse_args([]) 
Namespace(infile=<_io.TextIOWrapper name='<stdin>' encoding='UTF-8'>, 
      outfile=<_io.TextIOWrapper name='<stdout>' encoding='UTF-8'>) 
+2

我知道我對此前的回答說過,但_this_是_exactly_我​​正在尋找的東西。謝謝。 –

+4

我非常困惑。 OP表示輸入文件並不總是必需的。那麼爲什麼首先指定'infile'?爲什麼這些位置呢?最後,爲什麼OP不會運行代碼? 'argparse'教程似乎意味着它應該工作得很好...... – 2rs2ts

+1

@ 2rs2ts _why首先指定了'infile'?_ - 參數的特定順序僅僅是一個約定,您通常希望第一個參數指定一個輸入並且第二個指定輸出。 _爲什麼這些位置呢? - - 因爲作者的偏好。這種位置參數的用法沒有錯。當你想從標準輸入讀取並寫入一個文件,例如'app.py - outfile'時,在場景中使用時可能有些笨拙,但除了那個位置參數以外,它可以工作得很好。 _爲什麼OP的代碼不工作? - 它實際上工作得很好:) –

17

使用isatty你的程序detect是否在交互式會話或從文件中讀取:

if not sys.stdin.isatty(): # Not an interactive device. 
    # ... read from stdin 

然而,一致性和重現性的緣故,可以考慮以下的標準,如果文件名從標準輸入讀取是-。您可能需要考慮讓fileinput模塊處理該問題。

+0

這正是我一直在尋找。謝謝! –