How to inherit stdin and stdout in python by using os.execv()

前提是你 提交于 2020-01-09 11:45:35

问题


First, I wrote a c++ code as follows:

#include <cstdio>
int main()
{
    int a,b;
    while(scanf("%d %d",&a,&b) == 2)
        printf("%d\n",a+b);
    return 0;
}

I use g++ -o a a.cpp to complie it.

Afterwards, I wrote python code as follows:

import os,sys
sys.stdin = open("./data.in","r")
sys.stdout = open("./data.out","w")
pid = os.fork()
if pid == 0:
    cmd = ["./a","./a"]
    os.execv(cmd[0],cmd)

However, the data.out file contains nothing. That is to say, the child process did not inherit stdin and stdout from his parent process. But when I wrote a c++ code as follows:

#include<unistd.h>
#include<cstdio>
int main()
{
    freopen("data.in","r",stdin);a
    freopen("data.out","w",stdout);
    int pid = fork();
    if(pid == 0)
    {
        char* cmd[]= {"./a","./a"};
        execv(cmd[0],cmd);
    }
    return 0;
}

I got the right answer in the data.out, that is to say execv works in the c++ code.

So, what I should do to let execv also works in python? I really need this function to work, could anybody can tell me? thanks a lot!

data.in contains the following:

1 1

回答1:


In your python code, you've opened new IO streams and set the sys.stdin and sys.stdout Python names to point to these. They will have their own file descriptors (most likely 3, and 4). However the standard file descriptors, 0, and 1 will remain unchanged, and continue to point at their original locations. These are the descriptors inherited when you exec into stdin and stdout in your C++ program.

You need to make sure that the actual file descriptors are adjusted before execing.

os.dup2(sys.stdin.fileno(), 0)
os.dup2(sys.stdout.fileno(), 1)


来源:https://stackoverflow.com/questions/8500047/how-to-inherit-stdin-and-stdout-in-python-by-using-os-execv

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!