与孩子的孩子互动




我需要与我与subprocess产生的过程的stdinstdout直接互动。我可以做到:

proc = subprocess.Popen("/bin/bash", stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
proc.stdin.write(b"whoamin")
print(proc.stdout.readline())

但是,一旦过程分叉,我就无法再与它进行互动。我有这个测试程序:

// child.c
#include <unistd.h>
int main() {
    execve("/bin/bash", NULL, NULL);
}

我编译的:

gcc -o child child.c

当我尝试使用child而不是Popen呼叫中的/bin/bash的Python代码时,我会收到broken pipe错误。


我尝试的是:
由于Python创建的文件描述符默认不可遗传,因此我尝试更改它:

inr, inw = os.pipe()
outr, outw = os.pipe()
os.set_inheritable(inr, True)
os.set_inheritable(inw, True)
os.set_inheritable(outr, True)
os.set_inheritable(outw, True)
proc = subprocess.Popen("./child", stdin=inr, stdout=outw, stderr=outw)
proc.stdin.write(b"whoamin")
print(proc.stdout.readline())
os.close(inr)
os.close(inw)
os.close(outr)
os.close(outw)

,但我仍然遇到相同的错误。我认为这应该是一件容易的事,我可能缺少一些东西。任何帮助都将受到赞赏。

[编辑]在编辑帖子之前,我使用的是test而不是child作为我的测试c可执行文件的名称。我了解到这确实是位于/usr/bin/test的路径中的程序。
将可执行的名称更改为child成功解决了我的问题。经过数小时的试用和错误,我知道答案很简单...
非常感谢Barmar指出这一点!

呼叫test时,您正在调用/bin/test,而不是您的程序。

可以重命名您的C程序,因此它不会与标准命令相冲突,也不会使用PathName访问它,以免搜索$PATH

proc = subprocess.Popen("./test", stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

相关内容

  • 没有找到相关文章

最新更新