Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/457.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 检测到EOF时未读取标准数据的最后一行_Python_Stdin - Fatal编程技术网

Python 检测到EOF时未读取标准数据的最后一行

Python 检测到EOF时未读取标准数据的最后一行,python,stdin,Python,Stdin,这可能是一个简单的问题,但我基本上是在尝试用python复制cat命令的行为(非常稀疏和简单)。我希望用户能够输入他们想要的所有文本,然后当他们输入EOF(按ctrl+d或cmd+d)时,程序应该打印出他们输入的所有内容 import sys for line in sys.stdin: print line 如果我输入输入行并在最后一行后面加上返回字符,然后按cmd+d: never gonna give you up never gonna let you down never g

这可能是一个简单的问题,但我基本上是在尝试用python复制
cat
命令的行为(非常稀疏和简单)。我希望用户能够输入他们想要的所有文本,然后当他们输入EOF(按
ctrl+d
cmd+d
)时,程序应该打印出他们输入的所有内容

import sys
for line in sys.stdin:
    print line
如果我输入输入行并在最后一行后面加上返回字符,然后按
cmd+d

never gonna give you up
never gonna let you down
never gonna run around
and desert you
然后输出为

never gonna give you up
never gonna let you down
never gonna run around
and desert you
但是,如果我在最后一行“
上按下
cmd+d
,然后离开你
”,则输出为:

never gonna give you up
never gonna let you down
never gonna run around

我如何修改程序,以便如果用户在最后一行按下EOF,那么它仍然应该作为输出的一部分包含进来?

好的,这是wierd,但结果是有一个解释<代码>ctrl-d是“传输结束”(EOT),而不是EOF。它的意思是特定于环境的,但对于*nix终端来说,它意味着立即将输入缓冲区刷新到程序中

如果缓冲区中有字符,python的stdin将获取它们,但由于没有
\n
,因此stdin迭代器将对它们进行缓冲,并且不会发出任何消息

如果缓冲区中没有字符,python的stdin将获得一个空缓冲区,python遵循一条规则,即空缓冲区意味着EOF,它应该停止迭代

如果您键入一些字符,然后在一行中键入两个ctrl-d,您将获得缓冲字符,迭代将结束。而且,为了使事情尽可能复杂,如果您在sys.stdin中为行启动另一个
,它将愉快地继续接受输入

编辑

当您使用输入缓冲区中的数据按ctrl-d键时,此脚本将立即为您提供任何挂起的字符,但除非您按第二个ctrl-d键,否则它将不知道如何退出

import sys

while True:
    c = sys.stdin.read(1)
    if not c:
        break
    sys.stdout.write(c)
    sys.stdout.flush()

我认为这是Python2.7的问题。我在Python3.5上试过你的代码,效果很好


希望这有帮助

Control-D的行为实际上是操作系统的TTY驱动程序的函数,而不是Python的函数。TTY驱动程序通常一次向程序发送一整行数据。您会注意到,“cat”和大多数其他程序的行为方式相同

按照你的要求去做是不平凡的。它通常需要将TTY置于原始模式,读取和处理数据(您将获得Control-D字符本身),然后在退出之前将其从原始模式中取出(您不想在原始模式下退出!)


实现这一点的过程依赖于O/S,但您可能可以使用tty.setraw()和tty.setcbreak()。

我在python 2.7中尝试过,但它只是挂起,但在python 3.5中,它表现出了OP提到的奇怪行为。你在哪个操作系统上?我是linux。我在Windows 10上,使用Anaconda Python 3.5它的特定环境。。。您使用的是哪种操作系统?您或许应该阅读。诚然,这讨论的是shell脚本而不是Python,但有些问题是类似的,并且来自同一个源代码;代码显示了最后一行,没有显示最后一行之后的尾随数据。如果我像lubuntu那样从*nix操作系统运行此代码,我还会有这个问题吗?在安装vbox时,我在OSX中编写代码,这时我注意到了这个问题。我现在已经安装了一个lubuntu虚拟机,我只需要让这段代码在这个环境下工作。我在LinuxMint上(基于ubuntu),我用Python3.5复制了你的问题,所以是的,我认为这仍然是一个问题@Curt有一个有趣的建议,但是你可以做一些事情,比如一次读取一个字符来绕过它。我不认为你真的可以得到你想要的行为——“如果用户在最后一行按下EOF”——因为EOT被终端驱动程序吞没,它所做的只是刷新输入缓冲区
read(1)
将在按下ctrl-d时为您提供所有字符,但您不知道如何退出。用户必须再按一次。我很欣赏编辑,但我有没有办法设置它,让用户输入一块文本,然后打印出该块,而不是在输入时打印出每一行的解决方案?这是一个很好的解决方案,我更喜欢前者