如何在python中创建一个具有其他用户可以编写的权限的文件

时间:2016-04-20 13:35:46

标签: python permissions

我如何在python(3)中创建一个其他用户也可以写的文件。 到目前为止我已经改变了

os.chmod("/home/pi/test/relaxbank1.txt", 777)
with open("/home/pi/test/relaxbank1.txt", "w") as fh:
    fh.write(p1)  

我得到了什么

  

--- sr-S - t 1 root root 12 Apr 20 13:21 relaxbank1.txt

预计(在命令行中执行$ sudo chmod 777 relaxbank1.txt )

  

-rwxrwxrwx 1 root root 12 Apr 20 13:21 relaxbank1.txt

4 个答案:

答案 0 :(得分:32)

如果您不想使用os.chmod并希望使用适当的权限创建文件,则可以使用os.open创建相应的文件描述符,然后open描述符:

import os
# The default umask is 0o22 which turns off write permission of group and others
os.umask(0)
with open(os.open('filepath', os.O_CREAT | os.O_WRONLY, 0o777), 'w') as fh:
  fh.write(...)

Python 2注意:

Python 2.x中的内置open()不支持按文件描述符打开。请改用os.fdopen;否则你会得到:

TypeError: coercing to Unicode: need string or buffer, int found.

答案 1 :(得分:12)

问题是您对open()的调用会重新创建通话。要么在关闭文件后将chmod()移动到,要么将文件模式更改为w+

选项1:

with open("/home/pi/test/relaxbank1.txt", "w+") as fh:
    fh.write(p1)
os.chmod("/home/pi/test/relaxbank1.txt", 0o777)

选项2:

os.chmod("/home/pi/test/relaxbank1.txt", 0o777)
with open("/home/pi/test/relaxbank1.txt", "w+") as fh:
    fh.write(p1)

注释:Option1稍好一些,因为它处理文件可能尚不存在的情况(在这种情况下os.chmod()将抛出异常)。

答案 2 :(得分:1)

这是一种可靠的方法

#!/usr/bin/env python3
import stat
import os
path = 'outfile.txt'
with open(path, 'w') as fh:
    fh.write('blabla\n')
st = os.stat(path)
os.chmod(path, st.st_mode | stat.S_IWOTH)

了解如何:

另请参阅:Write file with specific permissions in Python

答案 3 :(得分:1)

类似于 AXO 的想法,即最好使用正确的权限创建文件,openeropen() 参数对于此目的似乎非常方便。

import os

def opener(path, flags):
    return os.open(path, flags, 0o777)

os.umask(0)  # Without this, the created file will have 0o777 - 0o022 (default umask) = 0o755 permissions
with open("myfile.txt", "w", opener=opener) as f:
    f.write("myline")

来自documentation for opener

<块引用>

自定义开启器可以通过传递一个可调用的作为开启器来使用。然后通过使用 (file, flags) 调用 opener 来获取文件对象的底层文件描述符。 opener 必须返回一个打开的文件描述符(将 os.open 作为 opener 传递会产生类似于传递 None 的功能)。