在python中支持sys.stdin.readlines()和命令行参数?

在python中支持sys.stdin.readlines()和命令行参数?,python,python-3.x,arguments,stdin,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 (stdi

我正在开发一个可以直接启动或通过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输入的情况下传递一个
-
命令行标志,但我想知道是否有比这更好的解决方法?我希望用户能够互换使用该应用程序,而不必记住添加
-
标志。

最好的方法是检查标准输入是否为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="")
$cat test.py
导入系统
对于sys.argv[1:]中的
打印(“命令行参数:”,a)
如果不是sys.stdin.isatty():
对于sys.stdin中的行:
打印(“标准输入:”,第行,结束=”)
$python3 test.py a b c
命令行arg:a
命令行参数:b
命令行arg:c
${echo 1;echo 2;}| python3 test.py a b c
命令行arg:a
命令行参数:b
命令行arg:c
标准:1
标准偏差:2
$python3 test.py a b c
via stdin的
是什么意思?这是否意味着您将其作为一个模块启动?@Sraw Stdin是您通过管道进入应用程序时产生的数据,例如,
echo“a”| script.py
将“a”作为sys.Stdin的一个元素。您的系统是什么?在Linux中,在没有任何管道的情况下直接调用脚本时,我使用了CTRL+D。@PhilipZou我已经使用了bash/zsh-但是代码非常简单(等待不存在的输入,而不是继续),在任何情况下都会失败。我的目的是不需要ctrl+D,但如果通过了stdin,则stdin可以工作,如果通过了,则cli参数可以工作。可以直接启动或通过stdin启动的应用程序,请您说明区别?看起来这是正在进行的票证测试,它相当健壮。你知道有什么限制吗?