2011-12-14 2 views
3

Во-первых, я написал C++ код следующим образом:Как наследовать стандартный ввод и стандартный вывод в Python с использованием os.execv()

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

Я использую g++ -o a a.cpp для Скомпилируйте его.

После этого я написал код питона следующим образом:

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) 

Однако файл data.out не содержит ничего. То есть, дочерний процесс не наследовал stdin и stdout из его родительского процесса. Но когда я написал C++ код следующим образом:

#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; 
} 

я получил правильный ответ в data.out, то есть execv работает в Си ++ кода.

Итак, что я должен сделать, чтобы execv также работал в python? Мне действительно нужна эта функция, чтобы кто-нибудь мог мне сказать? большое спасибо!

data.in содержит следующее:

1 1 

ответ

4

В коде Python, вы открыли новый IO потоков и установить sys.stdin и sys.stdout Python имена, чтобы указать на них. Они будут иметь свои собственные файловые дескрипторы (скорее всего, 3 и 4). Однако стандартные дескрипторы файлов, 0 и 1, остаются неизменными и продолжают указывать на их исходные местоположения. Это дескрипторы, унаследованные при exec в stdin и stdout в вашей программе на C++.

Вы должны убедиться, что фактические файловые дескрипторы настроены перед выполнением.

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