代码之家  ›  专栏  ›  技术社区  ›  Schof

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

  •  1
  • Schof  · 技术社区  · 15 年前

    我正在使用 pywin32 在python下访问win32 api的扩展。我刚开始用python编写Windows程序——我是个posix人——所以我可能是以一种硬性的方式做事情。

    我正在尝试使用 win32file.ReadFile 功能正常,我在解释可能的结果代码时遇到一些问题。

    我这样调用函数:

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

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

    如果要读取的字符超过4096个,则需要多次运行win32file.readfile,直到耗尽管道。为了查明是否需要多次运行readfile,我需要解释结果代码。

    这个 ActiveState docs 说:

    结果是一个(hr,string/pyoverlappedreadbuffer)的元组,其中hr可能是0,error_more_data或error_io_pending。

    因为我在函数调用中将overlapped值设置为none,所以我不需要担心任何pyoverlappedReadBuffer内容。(既然我得到了有效的数据,我想我是对的。)

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

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

    正确的方法是什么?

    编辑添加: 我不使用子流程,因为我需要将子流程添加到我创建的作业对象中。目标是,如果父进程死了,那么所有子进程都将立即死。通过将子进程添加到作业对象,子进程将在关闭作业对象的最后一个句柄时终止。当父对象退出时,由父对象持有的句柄将关闭。据我所知,所有这些都阻止我使用子流程。

    3 回复  |  直到 11 年前
        1
  •  2
  •   jdigital    15 年前

    有关错误代码,请尝试winerrror.error_more_data和winerrror.error_io_pending

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

        2
  •  0
  •   Ignacio Vazquez-Abrams    15 年前

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

    这个 .terminate() 如果运行2.6+,popen对象的方法将允许您终止进程。

        3
  •  -1
  •   efraimip    11 年前

    请注意,readfile定义为:

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

    在哪里?

    hFile = PyHANDLE
    

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

    buffer/bufSize = PyOVERLAPPEDReadBuffer
    

    它根据文档自动分配hfile的内容,不管它是否重叠。

    overlapped=None [=PyOVERLAPPED]
    

    如果愿意,可以分配一个额外的对象来获取重叠(buffer/bufsize)之外的任何额外数据,但默认情况下,这是空的。

    所以-你基本上可以调用readfile,比如:

    ReadFile(child_stdout_r, 0, None)
    

    指定给它的对象将包含文件句柄的全部内容。