在Windows上打开目录:'权限被拒绝'

时间:2014-02-14 16:55:58

标签: python windows

我正在尝试获取目录的文件描述符,但在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上获取目录的文件描述符?

2 个答案:

答案 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函数的文档,在此处记录:

the docs

您可能需要阅读相关部分,例如

  

要使用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中文件或文件夹的权限:

右键单击该文件或文件夹,然后单击“属性”。

单击“安全”选项卡。

单击“组或用户名”下的用户名或组。

所选用户或组的权限显示在属性对话框的下半部分。