【问题标题】:How to get a win32 handle of an open file in python?如何在python中获取打开文件的win32句柄?
【发布时间】:2011-09-02 09:50:13
【问题描述】:

我确定这在某处有记录,但我找不到...

我的代码正在从另一个库(我无法修改)获取一个 python 对象,我需要在它上面调用一些 win32 api 函数。

Python 从 file.fileno() 返回的不是操作系统级别的句柄,我的猜测是它提供了 MSVCRT 的 fileno。

>>> ctypes.windll.kernel32.CreateFileA('test',0x80000000L,1,None,3,0,0)
1948 # <- HANDLE

>>> file('test','r').fileno()
4 # <- not a HANDLE

如何将它转换成真正的win32句柄?

【问题讨论】:

  • 这似乎是一种骇人听闻的做事方式。我建议使用 CreateFile 方法,因为您可以完全控制传递给 CreateFile 的参数,并且它通常是获取句柄的正确方法。你也可以用 win32file 来做(而不是 ctypes)。
  • 这可能有点骇人听闻,但我不能自己执行 CreateFile(),因为我从不受我控制的代码中获取了一个 python 文件对象。

标签: python winapi


【解决方案1】:

我找到了答案:

>>> msvcrt.get_osfhandle(a.fileno())
1956 # valid HANDLE

这实际上记录在 http://docs.python.org/library/msvcrt.html 上,不知道我是怎么错过的。

【讨论】:

    【解决方案2】:

    win32file._get_osfhandle 来自 PyWin32 库将返回你想要的。 win32file._get_osfhandle(a.fileno()) 在我的测试中返回与 msvcrt.get_osfhandle(a.fileno()) 相同的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-28
      • 1970-01-01
      相关资源
      最近更新 更多