支持sys.stdin.readlines()以及python中的命令行参数?

时间:2017-09-25 04:32:07

标签: python python-3.x arguments stdin

我正在开发一个可以直接启动的应用程序,或者通过stdin。

目前,如果我没有将任何数据传输到应用程序,则永远不会收到EOF并且它会等待输入(例如ctrl + d)。该代码如下:

while True:
    line = sys.stdin.readline()
    print("DEBUG: %s" % line) 
    if not line:
       break

我也试过了:

for line in sys.stdin:
    print("DEBUG (stdin): %s" % line)
    return

然而,在这两种情况下,如果程序直接启动,则不会收到EOF,因此它会等待它。

我已经看到一些unix应用程序在预期stdin输入的情况下传递一个-命令行标志,但我想知道是否有更好的解决方法呢?我宁愿用户能够交替使用应用程序,而不记得添加-标志。

1 个答案:

答案 0 :(得分:3)

您可以做的最好的事情是检查标准输入是否为TTY,如果是,则不读取它:

$ cat test.py 
import sys

for a in sys.argv[1:]:
    print("Command line arg:", a)

if not sys.stdin.isatty():
    for line in sys.stdin:
        print("stdin:", line, end="")

$ python3 test.py a b c
Command line arg: a
Command line arg: b
Command line arg: c

$ { echo 1; echo 2; } | python3 test.py a b c
Command line arg: a
Command line arg: b
Command line arg: c
stdin: 1
stdin: 2

$ python3 test.py a b c < test.py 
Command line arg: a
Command line arg: b
Command line arg: c
stdin: import os, sys
stdin: 
stdin: for a in sys.argv[1:]:
stdin:     print("Command line arg:", a)
stdin: 
stdin: if not sys.stdin.isatty():
stdin:     for line in sys.stdin:
stdin:         print("stdin:", line, end="")