1

我正在使用pywin32扩展来访问 Python 下的 win32 API。我是在 Python 中进行 Windows 编程的新手——我是一个 POSIX 人——所以我可能会以一种愚蠢的方式做事。

我正在尝试正确使用win32file.ReadFile函数,但在解释可能的结果代码时遇到了一些麻烦。

我这样调用函数:

result, data = win32file.ReadFile(child_stdout_r, 4096, None)

我正在读取我启动的子进程的输出。我得到了很好的数据,但我担心管道中的数据可能超过 4096 个字符。(而且我宁愿这样做,而不是仅仅选择一个任意大的缓冲区大小。)

如果要读取的字符超过 4096 个,我需要多次运行 win32file.ReadFile 直到耗尽管道。要确定是否需要多次运行 ReadFile,我需要解释结果代码。

ActiveState 文档说:

结果是一个 (hr, string/PyOVERLAPPEDReadBuffer) 的元组,其中 hr 可能是 0、ERROR_MORE_DATA 或 ERROR_IO_PENDING。

由于我在函数调用中将重叠值设置为 None,我想我不需要担心任何 PyOVERLAPPEDReadBuffer 的东西。(而且由于我得到了有效的数据,我认为我是对的。)

我对 hr 结果变量有两个问题:

  1. 我在任何地方都找不到常量 ERROR_MORE_DATA 或 ERROR_IO_PENDING 的值。
  2. ActiveState 文档似乎暗示 0 表示成功,而常量(无论它们是什么)表示失败。Microsoft 文档指出 0 表示失败,非零表示成功,您需要运行 GetLastError 以了解更多信息。

这样做的正确方法是什么?

编辑添加:我没有使用子进程,因为我需要将子进程添加到我创建的作业对象中。目标是在父进程死亡时让所有子进程立即死亡。通过将子进程添加到作业对象,子进程将在作业对象的最后一个句柄关闭时终止。父级持有的句柄将在父级退出时关闭。据我所知,所有这些都使我无法使用子进程。

4

3 回答 3

3

对于错误代码,请尝试 winerror.ERROR_MORE_DATA 和 winerror.ERROR_IO_PENDING

我对 ActiveState 文档的解释与您的相同。听起来包装器的工作方式与本机 API 略有不同。抱歉,我还没有真正尝试过。

于 2010-01-15T20:59:24.070 回答
0

考虑使用subprocess启动进程。它将为您提供一组类似文件的对象,您可以使用这些对象与其他应用程序对话。

如果您正在运行 2.6+,则 Popen 对象的.terminate()方法将允许您终止进程。

于 2010-01-15T03:43:23.970 回答
-1

请注意,ReadFile 定义为:

(int, string) = ReadFile(hFile, buffer/bufSize , overlapped)

在哪里...

hFile = PyHANDLE

这是任何 Windows 句柄(可以是文件、进程、线程......)

buffer/bufSize = PyOVERLAPPEDReadBuffer

根据文档,它会自动分配 hFile 的内容,无论它是否重叠。

overlapped=None [=PyOVERLAPPED]

如果您愿意,您可以分配一个额外的对象来获取超出重叠(缓冲区/缓冲区大小)的任何额外数据,但默认情况下这是 NULL。

所以 - 你基本上可以像这样调用 ReadFile:

ReadFile(child_stdout_r, 0, None)

并且您分配给它的对象将包含文件句柄的全部内容。

于 2013-09-28T14:30:04.940 回答