Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.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中使用子进程从进程进行无缓冲读取_Python_Subprocess - Fatal编程技术网

在Python中使用子进程从进程进行无缓冲读取

在Python中使用子进程从进程进行无缓冲读取,python,subprocess,Python,Subprocess,我试图从一个产生长而耗时的输出的过程中读取数据。然而,我想在它被生产时捕捉它的输出。但是使用类似于以下的东西似乎是在缓冲命令的输出,因此我最终一次获得了所有的输出行: p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, bufsize=0) for line in p.stdout: print line 我正在MacOS 10.5上尝试这一点,文件迭代器正在进行一些内部缓冲。试试这个: line

我试图从一个产生长而耗时的输出的过程中读取数据。然而,我想在它被生产时捕捉它的输出。但是使用类似于以下的东西似乎是在缓冲命令的输出,因此我最终一次获得了所有的输出行:

p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, bufsize=0)
    for line in p.stdout:
        print line

我正在MacOS 10.5上尝试这一点,文件迭代器正在进行一些内部缓冲。试试这个:

line = p.stdout.readline()
while line:
    print line
    line = p.stdout.readline()

您还需要确保正在运行的进程实际上经常刷新其输出缓冲区。

通常,每个程序在其输入和/或输出通道上执行的缓冲比您希望的要多。。。除非它被愚弄到相信说的频道实际上是一个终端


为了达到“愚弄他人”的目的,请使用——它在Mac电脑上运行得很好(在Windows上的生活更艰难,尽管有一些解决方案可能会有所帮助——幸运的是,当您使用Mac电脑时,我们不需要详细讨论这些解决方案)。

这实际上是一个在Python 2.6中修复的错误:

复制:,在Python2.7上,p.stdout中的行的
仍然延迟其输出,而iter(p.stdout.readline,b'')中的行的
按预期工作(它会在行可用时立即生成行)。抱歉,2.x默认情况下不会使用新的io库,正如错误报告的最后一条评论所说;对于io.open(p.stdin.fileno())中的line,您必须执行类似于
的操作。
@Ari:对于io.open(p.stdout.fileno())中的line,这应该是
吗?
?谢谢,您为我节省了一些麻烦。您还需要确保正在运行的进程实际上经常刷新其输出缓冲区。我调试了半天,发现stdout在被导入管道时有相当大的缓冲区。因此,我不得不在程序的代码中添加一些刷新,以使输出实际出现。