Python pread / pwrite只在Unix上?

时间:2018-06-18 04:34:58

标签: python

Python文档准确无法在Unix上支持os.pread / pwrite,而不支持Windows吗?我问一个看起来很明显的问题,因为Windows在将功能添加到Python之前已经支持这些功能(通过不同的名称)将近20年,并且在Unix之前5年(特别是POSIX)支持它们。

2 个答案:

答案 0 :(得分:2)

真实情况是 - HAVE_PREAD导出了吗?

以下是相关片段:https://github.com/python/cpython/blob/4a172ccc739065bb658c75e8929774a8e94af9e9/Modules/posixmodule.c#L8422

由于MSVC ++不提供pread但为此使用ReadFile,因此不会通过os模块导出。

它确实似乎是在overlapped中导出的。您可以在_winapi找到它。

答案 1 :(得分:1)

是的,文档是正确的。您可以在posixmodule.c中查看来源,或者自己尝试一下。

原因是os模块按照open返回的POSIX样式文件描述符工作。 Windows支持POSIX样式的文件描述符,但不支持完整的POSIX API。

特定于Windows的基于HANDLE的API确实具有许多类似的功能 - 在某些情况下更多,在某些情况下更少,在某些情况下只是不同。对于文本文件的io等高级包装,反应器循环的asyncio,文件系统操作的shutil,管道的multiprocessing等,Python经常使用Win32 API,而不是在Windows上使用不完整的POSIX API。

但是对于os中的低级功能,它主要将每个函数直接映射到本机函数调用,这种包装器将很难做到,特别是在不强迫每个人使用非常弱的最低级别的情况下共同点。

这与Python在os.startfile中不支持任何内容的原因相同 - 即使macOS具有与Windows相似的功能,并且Linux已经通过xdg使用了多年,但两者都没有任何与Windows一样的东西。

(当然,正如Basile Starynkevitch在评论中暗示的那样,有些情况下可能可以完美地镜像API,而且它没有发生,因为没有人为它编写代码例如,Windows上的os.replace直到Python 3.3就属于这种情况。)