我正在尝试获取目录的文件描述符,但在on目录上调用os.open
总是会导致“权限被拒绝”错误。
我不相信这是一个权限问题,因为它发生在所有目录上,而文件没有问题(请参阅下面的REPL会话)。以管理员身份运行没有任何区别。
Python 2.7.6 (default, Nov 10 2013, 19:24:18) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.mkdir('mydir')
>>> os.access('mydir', os.F_OK)
True
>>> os.access('mydir', os.R_OK)
True
>>> os.access('.', os.R_OK)
True
>>> os.access('.', os.F_OK)
True
>>> os.open('myfile', os.O_RDWR)
3
>>> os.open('mydir', os.O_RDONLY)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: [Errno 13] Permission denied: 'mydir'
>>> os.open('mydir', os.O_RDWR)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: [Errno 13] Permission denied: 'mydir'
>>> open('mydir')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IOError: [Errno 13] Permission denied: 'mydir'
在Linux上它按预期工作:
>>> os.open('mydir', os.O_RDONLY)
3
文档并不表示您不能与任何平台区别。这是预期的行为吗?是否无法在Windows上获取目录的文件描述符?
答案 0 :(得分:2)
这不是权限问题,它永远不会用于Python 2. Python 2在执行_wopen
时使用Win 32 API调用os.open()
(代码:https://github.com/python/cpython/blob/2.7/Modules/posixmodule.c#L6554)。根据{{3}},它在打开目录时会抛出错误:
EACCES 试图打开只读文件进行写入,文件的共享模式不允许指定操作,或者给定路径是目录。
所以:
文档并不表示您不能与任何平台区别。是 这种预期的行为?
这是预期的行为。我想说在这种情况下,Python文档中没有说明这个细节。
是否无法在Windows上获取目录的文件描述符?
在Python 2上,您可以使用ctypes模块自行调用任意Win 32 API方法。 Python 3使用CreateFile
代替_wopen
,这是一个更现代的API调用,可以让您按照自己的意愿执行操作,请参阅下文。
此问题最重要的资源是CreateFile Win 32 API函数的文档,在此处记录:
您可能需要阅读相关部分,例如
要使用CreateFile打开目录,请指定 FILE_FLAG_BACKUP_SEMANTICS标志为dwFlagsAndAttributes的一部分。
另外,文档下面有一条评论,说
为了打开一个 处理您似乎需要SYNCHRONIZE访问的目录,即使 您没有请求任何访问权限。 (注意:这不适用于 你有备份/恢复权限。)
Python 3在多个地方使用此功能,您可能想要自己搜索
http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858%28v=vs.85%29.aspx
或通过git clone并使用grep -HR "CreateFile(" .
。在Python 3中,有一个_winapi.c模块,最常用于在Windows上执行os.open()
时。
在Python 2上,https://github.com/python/cpython/search?q=CreateFile&type=Code中有_wopen的调用,但我不确定它的定义。当您遵循此路径时,您将找到实际的实现。然后你可以看到Python究竟是如何调用该函数的 - 这与文档一起,很可能会解释你的观察结果。
答案 1 :(得分:0)
听起来你在Windows上没有合适的权限(也许你在Linux上做过。)这是来自 http://windows.microsoft.com/en-us/windows/what-are-permissions#1TC=windows-7 ,它会告诉你如何找到你拥有的权限在文件或目录上。
检查Windows中文件或文件夹的权限:
右键单击该文件或文件夹,然后单击“属性”。
单击“安全”选项卡。
单击“组或用户名”下的用户名或组。
所选用户或组的权限显示在属性对话框的下半部分。