如何写入Python子进程的stderr?

问题描述:

此问题与python subprocess.Popen - write to stderr相同。但是没有正确的答案。如何写入Python子进程的stderr?

我知道这是正确的。

import sys 
sys.stderr.write('abcd') 

这里是子过程(命名为输入)的代码。我想让子进程(输入)打印由父进程写入的字符串。

int main(int argc, char* argv[], char* envp[]){ 
    char buf[5]; 
    read(2, buf, 4); 
    buf[4]=0; 
    printf("%s\n", buf); 
} 

我想写入一个Python子进程stderr。但是,这是不正确的。 (也许你可以纠正这种或只是把我介绍另一 方式。)

from subprocess import * 
p = Popen(['./input'],stderr=PIPE) 
p.stderr.write('abcd') 

我有错误是这样的。

IOError: File not open for writing 

感谢您的帮助。

+1

如果您成功做到这一点,您希望在哪里出现“abcd”?它不会出现在终端上,因为管道的一端连接到子流程,另一端连接到父进程。理论上它可以出现在子过程中,但它只会*写入* stderr,而不是*读取*。你想要发生什么? –

+1

子进程写入其stderr。通过将其设置为管道,您可以设置父级以从中读取。如果你想让子进程写入它的stderr,它所执行的进程必须这样做。如果你想让这个错误消息进入父进程的stderr,那么你应该什么都不做,并且这个孩子会继承父进程的stderr。 –

+0

当你打开一个像这样的子进程时,stderr通常作为只读流打开。当然,你正在得到那个错误。你究竟在做什么以及为什么。在这种情况下,一些更详细和具体的背景可能确实有帮助。 –

os.pipe()

打开一个管道或从命令。返回值是连接到管道的打开文件对象,根据模式是'r'(默认)还是'w'可以读取或写入。 bufsize参数与内建的open()函数的相应参数具有相同的含义。该命令的退出状态(以wait()指定的格式编码)可用作文件对象的close()方法的返回值,但退出状态为零(无错终止)时,None回。

更改您的Python代码这一点:

from subprocess import * 
import os 

r, w = os.pipe() 
p = Popen(['./input'],stderr=r, stdout=PIPE) 
os.close(r) 
os.write(w, b'abcd') 
os.close(w) 
print(repr(p.communicate()[0])) 

您可以阅读Python os.pipe Examples

+1

你说得对。非常感谢。我需要了解更多关于管道的知识。 :P – pinohans