我如何在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
答案 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)
了解如何:
stat.S_IWOTH
代替了原始二进制常量,这更具语义+o
,并默认使用umask
,另请参见:How do you do a simple "chmod +x" from within python? 答案 3 :(得分:1)
类似于 AXO 的想法,即最好使用正确的权限创建文件,opener
的 open()
参数对于此目的似乎非常方便。
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")
<块引用>
自定义开启器可以通过传递一个可调用的作为开启器来使用。然后通过使用 (file, flags) 调用 opener 来获取文件对象的底层文件描述符。 opener 必须返回一个打开的文件描述符(将 os.open 作为 opener 传递会产生类似于传递 None 的功能)。