如何写入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
感谢您的帮助。
答
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
如果您成功做到这一点,您希望在哪里出现“abcd”?它不会出现在终端上,因为管道的一端连接到子流程,另一端连接到父进程。理论上它可以出现在子过程中,但它只会*写入* stderr,而不是*读取*。你想要发生什么? –
子进程写入其stderr。通过将其设置为管道,您可以设置父级以从中读取。如果你想让子进程写入它的stderr,它所执行的进程必须这样做。如果你想让这个错误消息进入父进程的stderr,那么你应该什么都不做,并且这个孩子会继承父进程的stderr。 –
当你打开一个像这样的子进程时,stderr通常作为只读流打开。当然,你正在得到那个错误。你究竟在做什么以及为什么。在这种情况下,一些更详细和具体的背景可能确实有帮助。 –