【问题标题】:Create a directory in /var/lib在 /var/lib 中创建一个目录
【发布时间】:2019-10-05 04:40:57
【问题描述】:

我正在使用以下代码创建一个目录(如果它不存在)和该目录中的一个文件:

import os

mystr = 'hello world!'
mypath = '/salam/me/'

if not os.path.exists(mypath):
    oldmask = os.umask(000)
    os.makedirs(mypath, 0755)
    os.umask(oldmask)

text_file = open(mypath + "myfile", "w")
text_file.write("%s" % mystr)
text_file.close()

但我从控制台得到IOError: [Errno 13] Permission denied。我关注了其他类似问题的答案,他们建议取消屏蔽并使用0755/0o755/0777/0o777

但是在这种情况下它们似乎不起作用。我做错了什么?

跟进问题:我想在/var/lib/ 做这份工作。会有所不同吗? (在设置权限方面)

注意这是 Python 2.7 版

【问题讨论】:

  • 如果你把权限 777 放在 /salam/me/ 问题就解决了吗?
  • 怎么会这样?
  • 该目录不存在。 777应该怎么放呢?
  • 问题标题和正文中的第二个问题非常不同:os.makedirs('/salam/me',...) 将尝试在 root 拥有的 / 下创建它,但通常您的 Python 脚本将在某些用户。至于问 “我想在 /var/lib/ 中完成这项工作,会有所不同吗?”,这是一个关于 Unix 权限的问题,而不是关于 Python 的问题(如果你输入了 mkdir ...从命令行,而在该用户帐户下,它也会失败)。此外,您暗示但从未说您的操作系统是 Linux;帮忙说一下是哪个版本?

标签: python permissions mkdir directory-permissions


【解决方案1】:

您需要以 root 身份运行脚本,因为父文件夹 /var/lib 归 root 所有。不需要 umask 命令。

除此之外,我会像这样重写代码以避免竞争条件:

#!/usr/bin/env python3
import os

mystr = 'hello world!'
mypath = '/salam/me/'

try:
    os.makedirs(mypath, 0755)
except FileExistsError:
    print('folder exists')

text_file = open(mypath + "myfile", "w")
text_file.write("%s" % mystr)
text_file.close()

然后以root身份运行脚本:

sudo python3 my_script.py

PS:如果你绑定的是 Python 2,则需要将上述解决方案中的FileExistsError 替换为OSError。但是你必须另外检查errno

#!/usr/bin/env python2
import errno
import os

mystr = 'hello world!'
mypath = '/salam/me/'

try:
    os.makedirs(mypath, 0755)
except OSError as e:
    if e.errno == errno.EEXIST:
        print('folder exists')
    else:
        raise

text_file = open(mypath + "myfile", "w")
text_file.write("%s" % mystr)
text_file.close()

【讨论】:

  • 您是否假设了特定版本的python?因为我使用的是 2.7,它说 FileExistsError 不存在
  • 我假设 python3.使用python2,您将绑定到OSError(它更通用,并不完全说明文件夹存在。也可能是其他一些错误)。尽可能使用 python3
  • 还有比OSError更具体的异常要捕获吗?
  • 我已经更新了我的答案并展示了一个专门处理EEXIST 的解决方案。几行代码,但与 python3 解决方案一样好
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-19
  • 1970-01-01
  • 1970-01-01
  • 2013-11-06
相关资源
最近更新 更多