【发布时间】:2015-11-07 23:03:09
【问题描述】:
我正在尝试集成一个小型 Win32 C++ 程序,该程序从标准输入读取并将解码结果(〜128 KB)写入输出流。
我用
将整个输入读入缓冲区while (std::cin.get(c)) { }
在我将整个输出写入标准输出之后。
当我从命令行运行应用程序时一切正常,例如test.exe < input.bin > output.bin,但是这个小应用程序应该从 Python 运行。
我希望应该使用 Python subprocess.communicate,文档说:
与进程交互:将数据发送到标准输入。从标准输出读取数据并 stderr,直到到达文件结尾。等待进程终止。
所以communicate() 将等到文件结束后再等待我的应用程序完成 - 我的应用程序退出时应该发生 EOF 吗?还是我应该明确地做 fclose(stderr) 和 fclose(stdout)?
【问题讨论】:
-
你不应该明确释放任何你没有明确获得的资源,除非你有特定的文档告诉你。不遵守这一点是难以解决问题的秘诀。
-
现在我明白了——子进程为管道的另一端获取自己的句柄/描述符,至少在子进程终止时关闭。
-
不相关:要模拟
test.exe < input.bin > output.binshell 命令,您可以使用subprocess.check_call('test', stdin=open('input.bin'), stdout=open('stdout.bin', 'w')),即不需要.communicate()。
标签: python c++ windows pipe subprocess