如何从命令行将 EOF 发送到 Python sys.stdin? CTRL-D 不起作用
我正在从 unix 上的命令行写入我的 Python 进程。我想发送 EOF(或以某种方式刷新标准输入缓冲区,以便 Python 可以读取我的输入。)
如果我按 CTRL-C,我会收到键盘错误。
如果我按下 CTRL-D,程序就会停止。
如何刷新标准输入缓冲区?
I am writing to my Python process from the commandline on unix. I want to send EOF (or somehow flush the stdin buffer, so Python can read my input.)
If I hit CTRL-C, I get a KeyboardError.
If I hit CTRL-D, the program just stops.
How do I flush the stdin buffer?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
Control-D 不应该让你的程序“停止”——它应该关闭标准输入,如果你的程序正确处理它,它可能会在需要时完美地继续!
例如,给定以下
st.py
:我们可以看到类似的情况:
如果在第三行的 Enter 之后立即按下 Control-D,则程序意识到标准输入已完成,并执行所需的后处理,一切都整齐而恰当。
如果你的程序在control-D上过早退出,那么它一定是编码错误的——编辑你的问题来添加你能想到的最小的“行为不当”程序怎么样,这样我们就可以准确地向你展示你是如何出错的?
Control-D should NOT make your program "just stop" -- it should close standard input, and if your program deals with that properly, it may perfectly well continue if it needs to!
For example, given the following
st.py
:we could see something like
if the control-D is hit right after the enter on the third line -- the program realizes that standard input is done, and performs the needed post-processing, all neat and proper.
If your program prematurely exits on control-D, it must be badly coded -- what about editing you question to add the smallest "misbehaving" program you can conceive of, so we can show you exactly HOW you're going wrong?
如果您使用“for l in sys.stdin”,则会对其进行缓冲。
您可以使用:
If you use 'for l in sys.stdin', it is buffered.
You can use:
我想我知道发生了什么事。您按下了
ctrl-D
,但没有按下enter
。如果您想向程序发送一行,只需按 Enter 键即可。如果您按了ctrl-D
而没有按enter
,您可以再次按ctrl-D
,然后您的程序应该会看到该行。在这种情况下(连续两个 ctrl-D),您的程序将不会在行尾看到换行符。例如,假设我有一个 Python 脚本
a.py
:我执行它:
然后输入以下内容:
程序将打印:
$
是 shell 提示符。这是包含上述输入的完整会话:$ python a.py
1号线
第 2 行 第 1 行
第 2 行$
(粗体显示程序的输出。罗马大小写用于显示我输入的内容,没有两个
ctrl-D
)如果这不是正在发生的事情,您需要告诉我们更多有关您正在做什么的信息。
I think I know what's happening. You are hitting
ctrl-D
without hittingenter
. If you want to send a line to the program, just hit enter. If you hitctrl-D
without hittingenter
, you can hitctrl-D
again and your program should see the line then. In this case (twoctrl-D
s in succession), your program will not see a newline at the end of the line.For example, let's say I have a Python script
a.py
:And I execute it:
And then enter the following:
the program will print:
$
is the shell-prompt. Here's a full session with the above input:$ python a.py
line 1
line 2 line1
line 2$
(Bold show the program's output. Roman-case is for showing what I typed, sans the two
ctrl-D
s)If this is not what's happening, you need to tell us more about what you are doing.