我正在Unix命令行上向我的Python进程写入内容。我想要发送EOF(或以某种方式刷新stdin缓冲区,以便Python可以读取我的输入)。
如果我按CTRL-C,则会出现KeyboardError错误。
如果我按CTRL-D,则程序只会停止。
如何刷新stdin缓冲区?
如果我按CTRL-C,则会出现KeyboardError错误。
如果我按CTRL-D,则程序只会停止。
如何刷新stdin缓冲区?
按下 Control-D 键不应该让你的程序“突然停止”——它应该关闭标准输入,如果你的程序正确处理了这种情况,它还可以继续运行!
例如,考虑以下 st.py
代码:
import sys
def main():
inwas = []
for line in sys.stdin:
inwas.append(line)
print "%d lines" % len(inwas),
print "initials:", ''.join(x[0] for x in inwas)
if __name__ == '__main__':
main()
我们可能看到类似于:
$ python st.py
nel mezzo del cammin di nostra vita
mi ritrovai per una selva oscura
che la diritta via era smarrita
3 lines initials: nmc
$
如果在第三行的回车后立即按下Ctrl+D,程序会意识到标准输入已完成,并执行所需的后处理,一切都很整洁和合理。
如果你的程序在Ctrl+D上提前退出,那么它肯定是编写得不好--为什么不编辑你的问题添加一个最小的可能出错的程序呢?这样我们就可以向你展示你错在了哪里。
while 1:
l = sys.stdin.readline()
for line in iter(sys.stdin.readline, ''):
来解决它。尝试运行cat | python2 -u -c"<use sys.stdin or sys.stdin.readline() here>"
并键入一些输入。 readline()
变体导致行立即可用。 - jfsctrl-D
而没有按下enter
键。如果您想将一行发送到程序,请只需按回车键。如果您按下ctrl-D
而没有按下enter
,则可以再次按下ctrl-D
,然后您的程序应该会看到该行。在这种情况下(连续两个ctrl-D
),您的程序将不会看到该行末尾的换行符。a.py
:import sys
for line in sys.stdin:
sys.stdout.write('%s' % line)
然后我执行它:
$ python a.py
然后输入以下内容:
line 1
line 2<ctrl-D><ctrl-D>
程序将打印:
line 1
line 2$
$
是 shell 提示符。下面是使用上述输入的完整会话:
$ python a.py
line 1
line 2 line1
line 2$
(粗体 显示程序的输出。罗马字母用于显示我键入的内容,不包括两个 ctrl-D
)
如果这不是您正在发生的事情,请告诉我们更多关于您正在做什么的信息。
try:
# You might be inside the while-loop
foo = raw_input('Spam: ') # Or whatever...
except EOFError:
print 'And now for something completely different.'
sys.exit()
termios
模块吗?http://docs.python.org/library/termios.html - Jason Orendorff