我正在使用pywin32扩展来访问 Python 下的 win32 API。我是在 Python 中进行 Windows 编程的新手——我是一个 POSIX 人——所以我可能会以一种愚蠢的方式做事。
我正在尝试正确使用win32file.ReadFile函数,但在解释可能的结果代码时遇到了一些麻烦。
我这样调用函数:
result, data = win32file.ReadFile(child_stdout_r, 4096, None)
我正在读取我启动的子进程的输出。我得到了很好的数据,但我担心管道中的数据可能超过 4096 个字符。(而且我宁愿这样做,而不是仅仅选择一个任意大的缓冲区大小。)
如果要读取的字符超过 4096 个,我需要多次运行 win32file.ReadFile 直到耗尽管道。要确定是否需要多次运行 ReadFile,我需要解释结果代码。
结果是一个 (hr, string/PyOVERLAPPEDReadBuffer) 的元组,其中 hr 可能是 0、ERROR_MORE_DATA 或 ERROR_IO_PENDING。
由于我在函数调用中将重叠值设置为 None,我想我不需要担心任何 PyOVERLAPPEDReadBuffer 的东西。(而且由于我得到了有效的数据,我认为我是对的。)
我对 hr 结果变量有两个问题:
- 我在任何地方都找不到常量 ERROR_MORE_DATA 或 ERROR_IO_PENDING 的值。
- ActiveState 文档似乎暗示 0 表示成功,而常量(无论它们是什么)表示失败。Microsoft 文档指出 0 表示失败,非零表示成功,您需要运行 GetLastError 以了解更多信息。
这样做的正确方法是什么?
编辑添加:我没有使用子进程,因为我需要将子进程添加到我创建的作业对象中。目标是在父进程死亡时让所有子进程立即死亡。通过将子进程添加到作业对象,子进程将在作业对象的最后一个句柄关闭时终止。父级持有的句柄将在父级退出时关闭。据我所知,所有这些都使我无法使用子进程。