什么是使用win32file.ReadFile从pipe道获取输出的正确方法?

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

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

我打电话这样的function:

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

我正在阅读我启动的subprocess的输出。 我得到了很好的数据,但是我担心pipe道中的数据可能会超过4096个字符。 (我宁愿这样做,而不是只是select一个任意大的缓冲区大小。)

在需要读取超过4096个字符的情况下,我需要多次运行win32file.ReadFile,直到耗尽pipe道。 为了找出是否需要多次运行ReadFile,我需要解释结果代码。

ActiveState文档说:

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

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

hr结果variables有两个问题:

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

什么是正确的方法来做到这一点?

编辑添加:我没有使用subprocess,因为我需要将subprocess添加到我创build的作业对象。 目标是如果父进程死亡,让所有subprocess立即死亡。 通过向作业对象添加subprocess,当作业对象的最后一个句柄closures时,subprocess将被终止。 由父母持有的手柄将在父母退出时closures。 所有这一切,据我所知,排除了我使用subprocess。

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

我对ActiveState文档的解释和你的一样。 这听起来像包装工具比原生API略有不同。 对不起,我实际上没有尝试过。

考虑使用subprocess来启动流程。 它会给你一个类似文件的对象,你可以用它来与另一个应用程序交谈。

.terminate()对象的.terminate()方法将允许您在运行2.6+时终止进程。

注意ReadFile被定义为:

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

哪里…

 hFile = PyHANDLE 

这是任何窗口句柄(可以是文件,进程,线程…)

 buffer/bufSize = PyOVERLAPPEDReadBuffer 

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

 overlapped=None [=PyOVERLAPPED] 

你可以分配一个额外的对象来取得任何额外的数据,除了重叠的(buffer / bufSize),如果你愿意,但默认情况下这是NULL。

所以 – 你可以像这样调用ReadFile:

 ReadFile(child_stdout_r, 0, None) 

而您分配的对象将包含文件句柄的全部内容。