支持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输入,但我想知道是否有更好的解决方法,然后呢?我宁愿用户能够交换使用该应用程序,而不记得添加-
标志。
答
你能做的最好的是检查标准输入是否是一个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
是什么'通过stdin'是什么意思?这是否意味着你将它作为模块启动? – Sraw
@Sraw Stdin是当你管道进入应用程序时的数据,例如'''回声“一个”|“ script.py'''把'a'作为sys.stdin的一个元素 – Codingo
你的系统是什么?当在Linux中没有任何管道的情况下直接调用脚本时,我得到了CTRL + D的工作。 –