2016-11-11 76 views
1

我有一個腳本,使用一些參數和一些stdin數據。我可以使用Python argparse根據需要設置stdin嗎?

爲了檢查我使用的參數argparse.ArgumentParser

是否可以檢查是否有任何標準輸入給出的數據是?類似的東西:

parser.add_argument('infile', nargs='?', type=argparse.FileType('r'), default=sys.stdin, required=True) 

但這個例子給出了這樣的錯誤:

TypeError: 'required' is an invalid argument for positionals

回答

1

號這wont't無論從任何文件,你通過它,可以在命令行或標準輸入上給定的讀取。你會得到一個開放的文件句柄,甚至沒有消耗一個字節/字符。

只需自己讀取數據,例如使用data = args.infile.read()(假設args是解析結果)。

然後,您可以測試它是否是空的,用一個簡單的if not data: ...

但通常,如果你希望在一個特定格式的數據,最好是簡單地嘗試分析它,並引發錯誤如果你失敗了。無論是空數據無效(例如json),或者它是有效的,但它應該是一個可接受的輸入。

(到錯誤,required只是告訴是否有些選項必須在命令行上給出,對於--options-o選項。除非你改變自己的號碼與nargs Positionals總是需要)。

0

從文檔The add_argument() method

required - Whether or not the command-line option may be omitted (optionals only).

required關鍵字僅用於選項(例如,-f--foo)不爲位置參數。把它拿出來。

parser.add_argument('infile', nargs='?', type=argparse.FileType('r'), 
    default=sys.stdin) 

當解析infile將是字符串或sys.stdin文件對象。您需要閱讀該文件以查看是否有任何內容。閱讀可能是有風險的......你可能永遠阻止。但那只是說用戶沒有遵循指示。

1

該錯誤僅僅是因爲required=True參數;消息告訴你什麼是錯的。它應該是:

parser.add_argument('infile', nargs='?', type=argparse.FileType('r'), default=sys.stdin) 

通過「呼叫」這個infile,而不是「--infile」,你已經創建了一個位置參數。​​本身決定它是否需要。用nargs='?'它不是必需的。它的定義是可選的(但不是optionals參數:))。

FileType類型讓您在命令行中命名文件(或' - ')。它會打開它(標準輸入已經打開)並將其分配給args.infile屬性。它什麼也沒做。

所以解析後,使用args.infile,您可以訪問該打開的文件,您可以根據需要閱讀(並且選擇性地關閉如果不是標準輸入)。

因此,這是讓用戶指定應在您的代碼中打開哪些文件的便捷方式。它旨在用於讀取一個文件,執行某些操作並寫入另一個文件的簡單腳本。

但是,如果你正在看的是stdin,使用這種類型沒有任何意義。 sys.stdin始終可供閱讀。並且沒有任何方法使解析器讀取stdin。它分析來自命令行的sys.argv

有一個@前綴文件功能,它告訴解析器從文件讀取命令行字符串。它解析文件並將值拼接到sys.argv。請參閱​​文檔。

相關問題