我试图得到一个目录的文件描述符,但在目录上调用os.open总是导致“权限被拒绝”的错误。 我不相信这是一个权限问题,因为它发生在所有目录上,而文件没有问题(请参阅下面的REPL会话)。 以pipe理员身份运行没有区别。
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上目录的文件描述符?
这不是一个权限问题,它将永远不能用于Python 2. Python 2在使用os.open()时使用Win 32 API调用_wopen (代码: https : //github.com/python/cpython/blob/2.7 /modulees/posixmodule.c#L6554 )。 根据文档 ,打开目录时会引发错误:
EACCES试图打开只读文件进行写入,文件的共享模式不允许指定的操作,或给定的路径是目录。
所以:
该文件并不表示你不能或任何平台的差异。 这是预期的行为?
这是预期的行为。 在这种情况下,我会说这个细节在Python文档中是没有说明的。
是不是可以得到Windows上目录的文件描述符?
在Python 2中,您可以使用ctypes模块自己调用任意的Win 32 API方法。 Python 3使用CreateFile而不是_wopen ,这是一个更现代化的API调用,它可以使你做你想做的事情,见下文。
此问题最重要的资源是CreateFile Win 32 API函数的文档,这里记录:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858%28v=vs.85%29.aspx
你可能想阅读它的相关部分,例如
要使用CreateFile打开目录,请将FILE_FLAG_BACKUP_SEMANTICS标志指定为dwFlagsAndAttributes的一部分。
另外,在文档下面有一个评论,说
为了打开一个目录的句柄,你似乎需要SYNCHRONIZE访问,即使你没有请求任何访问权限。 (注意:如果您有备份/恢复权限,则不适用。)
Python 3在几个地方使用这个函数,你可能想要自己搜索
https://github.com/python/cpython/search?q=CreateFile&type=Code
或者通过git clone和使用grep -HR "CreateFile(" .在Python 3中,有一个_winapi.c模块,这个模块在Windows上执行os.open()时最有可能被使用。
在Python 2中,调用了https://github.com/python/cpython/blob/2.7/modulees/posixmodule.c#L6554中的 _wopen,但我不确定这是在哪里定义的。 当你按照这个路径,你会发现实际的实现。 那么你可以看到Python究竟是如何调用这个函数的 – 这和文档一起,很可能会解释你的观察结果。
听起来你没有在Windows上的权限(也许你在Linux上)。这是从http://windows.microsoft.com/en-us/windows/what-are-permissions#1TC=windows-7它告诉你如何找到你在文件或目录上的权限。
在Windows中检查文件或文件夹的权限:
用鼠标右键单击该文件或文件夹,然后单击属性。
单击安全选项卡。
单击组或用户名下的用户名或组。
所选用户或组的权限显示在属性对话框的下半部分。