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

问题描述:

我正在研究可以直接或通过stdin启动的应用程序。支持sys.stdin.readlines()以及python中的命令行参数?

目前,如果我不向应用程序传输任何数据,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输入,但我想知道是否有更好的解决方法,然后呢?我宁愿用户能够交换使用该应用程序,而不记得添加-标志。

+0

是什么'通过stdin'是什么意思?这是否意味着你将它作为模块启动? – Sraw

+0

@Sraw Stdin是当你管道进入应用程序时的数据,例如'''回声“一个”|“ script.py'''把'a'作为sys.stdin的一个元素 – Codingo

+0

你的系统是什么?当在Linux中没有任何管道的情况下直接调用脚本时,我得到了CTRL + D的工作。 –

你能做的最好的是检查标准输入是否是一个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="") 
+0

看起来这是票 - 现在正在进行测试,而且相当健壮。你知道的任何限制? – Codingo