python - 我应该始终明确关闭标准输出吗?

标签 python c++ windows pipe subprocess

我正在尝试集成一个小型 Win32 C++ 程序,该程序从标准输入读取并将解码结果(~128 KB)写入输出流。

我用

将整个输入读入缓冲区
while (std::cin.get(c)) { }

在我将整个输出写入标准输出之后。

当我从命令行运行应用程序时一切正常,例如 test.exe < input.bin > output.bin ,但是这个小应用程序应该从 Python 运行。

我希望 Python subprocess.communicate应该使用,文档说:

Interact with process: Send data to stdin. Read data from stdout and stderr, until end-of-file is reached. Wait for process to terminate.

所以 communicate()将等到文件结束后再等待我的应用程序完成 - EOF 应该在我的应用程序退出时发生吗?或者我应该明确地执行 fclose(stderr) 和 fclose(stdout) 吗?

最佳答案

不要关闭标准输出

在一般情况下,它实际上是错误的,因为可以用 atexit() 注册一个函数。它尝试写入 stdout,如果 stdout 关闭,这将中断。

当进程终止时,操作系统会自动关闭所有句柄。这包括标准输出,因此您无需手动关闭它。

(从技术上讲,C++ 运行时将 normally 尝试在操作系统有机会介入之前刷新并关闭所有 C++ 流,但操作系统绝对必须关闭运行时运行的任何句柄, 对于 whatever reason , 未命中。)

在特殊情况下,关闭标准流可能很有用(例如,在守护进程时),但应该非常小心。重定向到空设备(/dev/null 在 Unix 上,nul 在 Windows 上)通常是一个好主意,这样期望与这些流交互的代码仍然会工作。在 Unix 上,这是通过 freopen(3) 完成的。 ; Windows 有 an equivalent function ,但它是 POSIX API 的一部分,可能不适用于标准 Windows I/O。

关于python - 我应该始终明确关闭标准输出吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32014310/

相关文章:

c++ - 将动态分配的指针数组调整为类

objective-c - 在 Windows 上开发 iOS 应用程序有哪些选择?

c# - 发送多个 Ping 而不等待回复 Windows C#

python - 用python编码元组列表?

python - 我可以用 python 列表过滤 django 模型吗?

Python并行编程问题

Python:使用 argparse 解析多种数据类型

c++ - 在不同线程中使用map::empty和map::insert

c++ - 如何实现 Cloneable 类?

python - 如何将不同进程的任务栏图标与Windows 7结合起来