os.access 在 IronPython 中对模式 os.F_OK 返回无用值

1 投票
1 回答
833 浏览
提问于 2025-04-16 22:15

我有一堆Python脚本,想在IronPython中使用(因为我需要C#的功能),但是在使用os.access方法时遇到了一些问题。

当我用os.access方法检查一个路径是否可以访问时,设置的模式是os.F_OK(就是看看这个路径能不能被访问),结果每次都返回False,即使在Python解释器中检查这个目录时返回的是True。不过奇怪的是,当我用os.R_OK、os.W_OK和os.X_OK这些模式调用os.access时,结果却是True。

这里有一段我写的代码来演示这个问题:

import os

d = ["C:\\", ".\\", "./", ".", "C:\\BOGUS_DIR"]

for path in d:
    print path
    try:
        print "access: %s"%os.access(path, os.F_OK)
        print "read: %s"%os.access(path, os.R_OK)
        print "write: %s"%os.access(path, os.W_OK)
        print "execute: %s"%os.access(path, os.X_OK)
        print "-------------------------"
    except Exception, e:
        print e

print "finished"

raw_input("")

结果是:

C:\
access: False
read: True
write: True
execute: True
-------------------------
.\
access: False
read: True
write: True
execute: True
-------------------------
./
access: False
read: True
write: True
execute: True
-------------------------
.
access: False
read: True
write: True
execute: True
-------------------------
C:\BOGUS_DIR
access: False
[Errno 2] Could not find file 'C:\BOGUS_DIR'.
finished

为了验证,我还在列表中加了一个虚假的目录(一个不存在的目录)。用os.access检查这个虚假目录时,模式os.F_OK返回了False(就像之前一样),但是用os.R_OK检查时却抛出了一个异常(这也是预期的结果)。

另外,我在Python解释器中测试了os.access方法,结果是正常的。

我似乎找不到其他人有这个问题,所以我第一反应是我可能做了什么傻事(或者漏掉了什么明显的东西)。我是在Visual Studio 2010中运行IronPython代码的,或许那里有些东西在干扰。

如果能得到帮助,我将非常感激。谢谢!

1 个回答

1

首先,os.access 这个函数可能会让人误解——其实直接打开文件并处理可能出现的错误更靠谱。

IronPython 使用 os.F_OK 来表示“这个文件存在吗”,实际上它是调用 File.Exists() 这个方法——不过对于文件夹来说,这个方法会返回 false。

这是一个bug,应该在 2.7.1 版本中修复。

撰写回答