验证目录写入权限

时间:2013-01-29 02:53:05

标签: python posix

我在Python 2.7中编写一个程序,它检索远程文件并将它们转储到可由用户指定的目录中。目前,为了验证程序实际上可以写入该目录,我执行以下操作(假设dumpdir是一个包含要检查的目录名称的字符串):

try:
    os.mkdir(dumpdir+'/.mwcrawler')
    os.rmdir(dumpdir+'/.mwcrawler')
except:
    logging.error('Could not open %s for writing, using default', dumpdir)

但这比我通常的代码更加晦涩。什么是正确的方法去做?也许对特权有某种断言?

2 个答案:

答案 0 :(得分:2)

link描述了os.access的用法,os.access是专门为您的需求而创建的方法。

它还解释了一种更好的方法来处理权利检查。

正如在评论中正确提到的那样,{{1}}在一些特定情况下会有问题,所以为了完全确定,“命中运行”方法实际上更好,尝试写,捕获异常,看看发生了什么 - 从那里开始。

答案 1 :(得分:2)

一般来说,最好是请求宽恕而不是许可 - 无论如何你必须处理写入每个文件的错误,为什么要提前检查?

但是,当你有一个用户界面 - 甚至是一个命令行界面,你可以在任何写作之前读取prefs文件 - 用户通常会更方便地尽快返回错误。只要这是您进行此检查的唯一原因,就没有任何问题。

但是,有很多方法可以改进方式进行检查。

首先,您几乎不应该只使用except:而不指定任何内容。除了它在不同版本的Python中捕获不同的东西(因此也混淆了用于其他版本的人类读者)这一事实,这意味着你无法区分不可写,不良的Unicode字符,甚至代码中的拼写错误

另外,如果无法写入,您的错误消息会显示“不可读”,这很奇怪。

其次,除非你确定没有人会有一个名为.mwcrawler的文件(例如,因为你拒绝传输以'.'开头的文件),使用任何固定名称只是要求麻烦。更好的解决方案是使用例如tempfile.mkdtemp

此外,如果您想要移植,则应避免对路径使用字符串操作。这就是os.path(以及更高级别的实用程序)的用途 - 因此您无需学习或思考Windows,zOS等。

全部放在一起:

try:
    d = tempfile.mkdtemp(prefix='.mwcrawler', dir=dumpdir)
except Exception as e:
    logging.error('Could not open %s for reading (%s), using default', dumpdir, e)
else:
    os.rmdir(d)