如何从命令行将 EOF 发送到 Python sys.stdin? CTRL-D 不起作用

发布于 2024-08-15 08:56:07 字数 162 浏览 5 评论 0原文

我正在从 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

叫思念不要吵 2024-08-22 08:56:07

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
$ 

如果在第三行的 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:

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()

we could see something like

$ 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
$ 

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?

桜花祭 2024-08-22 08:56:07

如果您使用“for l in sys.stdin”,则会对其进行缓冲。

您可以使用:

  while 1:
     l = sys.stdin.readline()

If you use 'for l in sys.stdin', it is buffered.

You can use:

  while 1:
     l = sys.stdin.readline()
树深时见影 2024-08-22 08:56:07

我想我知道发生了什么事。您按下了ctrl-D,但没有按下enter。如果您想向程序发送一行,只需按 Enter 键即可。如果您按了 ctrl-D 而没有按 enter,您可以再次按 ctrl-D,然后您的程序应该会看到该行。在这种情况下(连续两个 ctrl-D),您的程序将不会在行尾看到换行符。

例如,假设我有一个 Python 脚本 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
1号线
第 2 行 第 1 行
第 2 行$

粗体显示程序的输出。罗马大小写用于显示我输入的内容,没有两个 ctrl-D

如果这不是正在发生的事情,您需要告诉我们更多有关您正在做什么的信息。

I think I know what's happening. You are hitting ctrl-D without hitting enter. If you want to send a line to the program, just hit enter. If you hit ctrl-D without hitting enter, you can hit ctrl-D again and your program should see the line then. In this case (two ctrl-Ds 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:

import sys

for line in sys.stdin:
    sys.stdout.write('%s' % line)

And I execute it:

$ python a.py

And then enter the following:

line 1
line 2<ctrl-D><ctrl-D>

the program will print:

line 1
line 2$

$ 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-Ds)

If this is not what's happening, you need to tell us more about what you are doing.

℉服软 2024-08-22 08:56:07
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()
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()
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文