Ste*_*fan 11 python file-permissions chmod shlex
这是我的设置:
我有一个VirtualMachine(Ubuntu 14.04.LTS),其中运行PostgreSQL/PostGIS数据库.
使用QGIS中的Windows 7,我连接到此数据库并将要素图层加载到我的GIS项目中.
使用一些python代码,我创建了一个带有tile ID和一些信息的文件.
import os
import io
import time
layer=None
for lyr in QgsMapLayerRegistry.instance().mapLayers().values():
if lyr.name() == "fishnet_final":
layer = lyr
for f in layer.selectedFeatures():
pth = os.path.join(os.path.dirname(r'H:\path_to_file\'), str(f['name']) + "_" + str(time.strftime("%Y-%m-%d")) + "_" + str(f['country']) + ".txt")
fle = open(pth,'wb')
fle.writelines(str(f['name']))
fle.write('\n')
fle.write(str(time.strftime("%Y-%d-%m")))
fle.write('\n')
fle.write(str(f['country']))
fle.write('\n')
fle.close()
os.rename(pth, pth.replace(' ', ''))
Run Code Online (Sandbox Code Playgroud)
该文件具有以下权限:
-rwx------
Run Code Online (Sandbox Code Playgroud)
我想为我的群组和其他人设置相同的权限.
-rwxrwxrwx
Run Code Online (Sandbox Code Playgroud)
我试过了:
import shlex
command=shlex.split("chmod 777 r'H:\path_to_file\file.txt'")
subprocess.call(command)
Run Code Online (Sandbox Code Playgroud)
没有成功.
工作的是:
command=shlex.split("touch r'H:\path_to_file\file.txt'")
Run Code Online (Sandbox Code Playgroud)
要么
command=shlex.split("rm r'H:\path_to_file\file.txt'")
Run Code Online (Sandbox Code Playgroud)
为什么不能使用chmod命令?
在UNIX下我可以chmod这个文件,我和Windows中的用户一样.
我也尝试过os.chmod方法.但没有成功.
import os, stat
st = os.stat(r'H:\path_to_file\file.txt')
os.chmod(r'H:\path_to_file\file.txt', st.st_mode | 0o111 )
Run Code Online (Sandbox Code Playgroud)
UPDATE
当我在UNIX(Solaris)下执行"chmod 777文件"时,权限是
-rwxrwxrwx
Run Code Online (Sandbox Code Playgroud)
我现在可以做的是在GIS项目中降级/删除Windows下的权限:
subprocess.call(r'chmod 400 "H:\path_to_file\file.txt"', shell=True)
0
-r-xr-xr-x
Run Code Online (Sandbox Code Playgroud)
使用此命令,我0在python控制台输出中获得反馈
0当我在新文件上执行chmod 777时,我也得到了反馈,但没有任何反应.
问题是我只能降级权限.我无法设置新权限!
从os模块文档:
注意:尽管Windows支持chmod(),但您只能使用它设置文件的只读标志(通过stat.S_IWRITE和stat.S_IREAD常量或相应的整数值).所有其他位都被忽略.
对于Windows权限,您可以管理ACL.根据另一个答案,你需要pywin32库:
import win32security
import ntsecuritycon as con
FILENAME = r"H:\path_to_file\file.txt"
user, domain, type = win32security.LookupAccountName ("", "Your Username")
sd = win32security.GetFileSecurity(FILENAME, win32security.DACL_SECURITY_INFORMATION)
dacl = sd.GetSecurityDescriptorDacl() # instead of dacl = win32security.ACL()
dacl.AddAccessAllowedAce(win32security.ACL_REVISION, con.FILE_ALL_ACCESS, user)
sd.SetSecurityDescriptorDacl(1, dacl, 0) # may not be necessary
win32security.SetFileSecurity(FILENAME, win32security.DACL_SECURITY_INFORMATION, sd)
Run Code Online (Sandbox Code Playgroud)
将con.FILE_ALL_ACCESS标志更改为您需要的标志.
shell 命令中 r 字符的用途是什么?你的意思是把它放在整个字符串的前面吗?你检查过touch生成的是哪个文件吗?
当我尝试您的示例时,它运行此命令:['touch', 'rH:\\path_to_file\x0cile.txt'],即创建文件rH:\path_to_file\file.txt
这对我来说效果很好:
command=shlex.split("chmod 777 'H:\path_to_file\file.txt'")
subprocess.call(command)