2017-01-15 27 views
2

当C++命令行程序不工作通信I具有以下Python代码,这是为了提供INTIAL输入到C++程序,然后取它的输出并反馈到它,直到程序完成执行:的Python:使用<cstdio>

comm.py

p = subprocess.Popen('test__1.exe', bufsize=1, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=False) 
p.stdin.flush() 
p.stdout.flush() 
x = b'1\n' 
while True: 
    p.stdin.write(x) 
    p.stdin.flush() 
    p.stdout.flush() 
    x = p.stdout.readline() 
    print(x) 
    if p.poll() != None: 
     break 

我目前有两个简单的C++程序测试它:

test__1.cpp:

#include <iostream> 
using namespace std; 
int main() 
{ 
    for(int i = 0; i < 3; ++i) 
    { 
     int n; 
     cin >> n; 
     cout << n+1 << endl; 
    } 
    return 0; 
} 

test__2.cpp

#include <cstdio> 
int main() 
{ 
    for(int i = 0; i < 3; ++i) 
    { 
     int n; 
     scanf("%d", &n); 
     printf("%d\n", n+1); 
    } 
    return 0; 
} 

comm.py打开test__1.exe一切正常,但是当它打开test__2.exe它挂在第一次调用的ReadLine()。 需要注意的是,当我执行之前喂test__2.exe整个输入不会发生此问题(即初始设置X =“1 \ N2 \ N3 \ n”

什么可能会造成这个问题?

(另外,comm.py应该能够处理任何合法的C++程序,所以只有使用的iostream不会是一个可接受的解决方案。)

编辑:我还需要解决在Windows上运行。

回答

1

它由std::endl刷新ostreamprintf冲不stdout, 你可以通过修改test__2.cpp看到如下的事实造成的:

#include <cstdio> 
int main() 
{ 
    for(int i = 0; i < 3; ++i) 
    { 
     int n; 
     scanf("%d", &n); 
     printf("%d\n", n+1); 
     fflush(stdout); //<-- add this 
    } 
    return 0; 
} 

你说你要模块正常工作与任何C++程序,这样 你不能依赖它来冲洗每次写操作之后的标准输出(或标准错误) 。

也就是说,你必须使程序的标准流是缓冲 和这样做外部程序本身。你需要做的是在 comm.py。在Linux(或其他提供GNU Core Utils的主机)中,您可以通过 通过stdbuf执行程序,例如,

import subprocess 

cmd = ['/usr/bin/stdbuf', '-i0','-o0', '-e0', './test__2'] 
p = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=False) 
p.stdin.flush() 
p.stdout.flush() 
x = b'1\n' 
while True: 
    p.stdin.write(x) 
    x = p.stdout.readline() 
    print(x) 
    if p.poll() != None: 
     break 

其中无缓冲所有标准流。对于Windows,您将需要 来研究如何做同样的事情。暂时我不知道。

+0

这是一个有效的解决方案,但遗憾的是它并没有解决我的问题,因为我需要comm.py任何有效的C++编程工作。 在冲洗ostream的,为什么犯规行: p.stdout.flush() 做? –

+0

@ black-goat是的,我正在思考,而且还是。查看更新。 –

+0

谢谢您的意见。可惜我忘了提及我需要它在Windows上工作,但我会尝试找到与您的建议类似的东西。 –