2024-10-06 12:26:51 发布
网友
Python文档是否准确os.pread/pwrite操作系统仅在Unix上受支持,Windows不受支持?我问了一个看起来非常明显的问题,因为Windows在将这些功能添加到Python之前已经支持了近20年(以不同的名称命名),而在Unix(特别是POSIX)支持这些功能之前5年。在
真正的条件是-HAVE_PREAD是否导出?在
HAVE_PREAD
以下是相关片段:https://github.com/python/cpython/blob/4a172ccc739065bb658c75e8929774a8e94af9e9/Modules/posixmodule.c#L8422
由于MSVC++没有提供pread,而是使用了^{},所以它不会通过os模块导出。在
pread
os
不过,它似乎是在overlapped中导出的。您可以在_winapi中找到它。在
_winapi
是的,文件是正确的。您可以在^{}中看到源代码,也可以自己尝试一下。在
原因是os模块按照POSIX风格的文件描述符工作,正如open返回的那样。Windows确实支持POSIX风格的文件描述符,但不支持完整的posixapi。在
open
基于Windows的基于HANDLE的API确实有很多相似的功能,在某些情况下更多,在某些情况下更少,在某些情况下只是不同。对于高级包装器,如文本文件的io,asyncio用于反应器循环,shutil用于文件系统操作,multiprocessing用于管道等,Python经常使用win32api,而不是在Windows上使用不完整的POSIX API。在
HANDLE
io
asyncio
shutil
multiprocessing
但是对于os中的低级功能(主要是将每个函数直接映射到本机函数调用),这种包装将非常困难,尤其是如果不强制每个人使用非常弱的最小公分母。在
这也是Python在os.startfile中只支持Windows之外的任何东西的原因——尽管macOS拥有类似功能的时间甚至比Windows长,而且Linux已经通过xdg拥有了多年,但两者都没有与Windows完全相同的功能。在
os.startfile
(当然,正如Basile Starynkevitch在一篇评论中所暗示的那样,在某些情况下,将完美地镜像一个API,但它并没有发生,因为没有人为它编写代码。例如,在python3.3之前的Windows上,os.replace就是这种情况。)
os.replace
真正的条件是-
HAVE_PREAD
是否导出?在以下是相关片段:https://github.com/python/cpython/blob/4a172ccc739065bb658c75e8929774a8e94af9e9/Modules/posixmodule.c#L8422
由于MSVC++没有提供} ,所以它不会通过
pread
,而是使用了^{os
模块导出。在不过,它似乎是在overlapped中导出的。您可以在
_winapi
中找到它。在是的,文件是正确的。您可以在^{} 中看到源代码,也可以自己尝试一下。在
原因是
os
模块按照POSIX风格的文件描述符工作,正如open
返回的那样。Windows确实支持POSIX风格的文件描述符,但不支持完整的posixapi。在基于Windows的基于
HANDLE
的API确实有很多相似的功能,在某些情况下更多,在某些情况下更少,在某些情况下只是不同。对于高级包装器,如文本文件的io
,asyncio
用于反应器循环,shutil
用于文件系统操作,multiprocessing
用于管道等,Python经常使用win32api,而不是在Windows上使用不完整的POSIX API。在但是对于
os
中的低级功能(主要是将每个函数直接映射到本机函数调用),这种包装将非常困难,尤其是如果不强制每个人使用非常弱的最小公分母。在这也是Python在
os.startfile
中只支持Windows之外的任何东西的原因——尽管macOS拥有类似功能的时间甚至比Windows长,而且Linux已经通过xdg拥有了多年,但两者都没有与Windows完全相同的功能。在(当然,正如Basile Starynkevitch在一篇评论中所暗示的那样,在某些情况下,将完美地镜像一个API,但它并没有发生,因为没有人为它编写代码。例如,在python3.3之前的Windows上,
os.replace
就是这种情况。)相关问题 更多 >
编程相关推荐