一個處理資料的 CLI command 一定會有資料輸入,而輸入來源可以是檔案,也可以是從標準輸入(Standard Input, STDIN)而來,若需要同時支援標準輸入與指定參數(檔案路徑),則需要判斷輸入來源為何。參數判斷的部分,若是使用 argparse  開發的話,則在呼叫 argparse.add_argument() 時就可以設定好參數,最後呼叫 argparse.parse_args() 時即可得知是否有參數輸入,那標準輸入要如何判斷?

 

I/O Redirection 與 TTY

一個標準的 Linux TTY  是可以透過指令與機器互動的(Interactive),而當我們透過 I/O Redirection  將輸出接到另一個程式的標準輸入時,則另一個程式並不是在 TTY 下執行,因為該程式不能夠透過指令進行互動。

因此,只要判斷 Python 是不是在 TTY 下執行,就可以判斷 Python 在執行時是否有標準輸入。我們可以簡單地透過 sys.stdin.isatty()  來達成這件事情。

$ python -c 'import sys; print(sys.stdin.isatty())'
True
$ echo test | python -c 'import sys; print(sys.stdin.isatty())'
False
$ python -c 'import sys; print(sys.stdin.isatty())' < ~/.bashrc
False

References

留言