2015-05-06 46 views
1

假设有一个程序产生具有不同输入的不同输出,并且如果输入是特定值则终止。例如,它可以用C++编写:Python中的进程 - 获取非终止进程的标准输出

int main() { 
    int i; 
    while(true) { 
     cin >> i; 
     if (i) cout << i << endl; 
     else break; 
    } 
    return 0; 
} 

在这个程序中,如果你输入一个整数,它会把它打印在屏幕上。程序永远不会终止,直到您输入0

那么我怎样才能用Python立即获取stdin对应的stdin?也就是说,如果我给标准输入写'1',我会希望立即从标准输出读取一个'1',而这个过程还没有结束。


结论:有两种实现方法。

  1. 使用subprocess.Popen,和治疗标准输出或子进程的标准输入作为一个文件,写入标准输入(需要'\n'),并与readline

  2. 使用库Pexpect的从标准输出读取。

+0

你就不能读取子进程的标准输出? –

+0

对于我们这些不读C++的人,你应该提到输出的内容。具体来说,是否以换行符结束? –

+0

如果使用'subprocess.Popen'模块,并直接读取,它将一直等待,什么都不做。 – Moonshile

回答

1

使用subprocess.Popen()

>>> import subprocess 
>>> p = subprocess.Popen(['/your/cpp/program'], stdin=subprocess.PIPE, stdout=subprocess.PIPE) 
>>> p.stdin.write('1\n') 
>>> p.stdout.readline() 
'1\n' 
>>> p.stdin.write('10\n') 
>>> p.stdout.readline() 
'10\n' 
>>> p.stdin.write('0\n') 
>>> p.stdout.readline() 
'' 
>>> p.wait() 
0 
+0

可能有[儿童中的缓冲问题](http://stackoverflow.com/q/20503671/4279)(在这种情况下,没有因为在'endl'上的隐式刷新)和父项(你的脚本) 。后者可以在Python 3上使用'p.stdin.flush()'或'bufsize = 1'来修复,默认情况下'bufsize'非零。 – jfs

相关问题