这是我的设置:
我有一个虚拟机(Ubuntu 14.04。LTS),其中运行PostgreSQL/PostGIS数据库。
使用QGIS中的Windows7,我连接到这个数据库,并将特征层加载到我的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(' ', ''))
该文件具有以下权限:
-rwx------
我还想为我的组和其他组设置相同的权限。
-rwxrwxrwx
我试过了:
import shlex
command=shlex.split("chmod 777 r'H:path_to_filefile.txt'")
subprocess.call(command)
没有成功。
起作用的是:
command=shlex.split("touch r'H:path_to_filefile.txt'")
或
command=shlex.split("rm r'H:path_to_filefile.txt'")
为什么不使用chmod命令?
在UNIX下,我可以修改这个文件,而且我和Windows中的用户是一样的。
我还尝试了os.chmod方法。但没有成功。
import os, stat
st = os.stat(r'H:path_to_filefile.txt')
os.chmod(r'H:path_to_filefile.txt', st.st_mode | 0o111 )
更新
当我在UNIX(Solaris)下执行"chmod 777文件"时,权限是
-rwxrwxrwx
我现在能做的是在GIS项目中降级/删除Windows下的权限:
subprocess.call(r'chmod 400 "H:path_to_filefile.txt"', shell=True)
0
-r-xr-xr-x
使用此命令,我在python控制台输出中获得0
反馈
当我对新文件执行chmod 777时,我也得到了0
反馈,但什么都没发生。
问题是我只能降级权限。我无法设置新权限
来自操作系统模块文档:
注意:尽管Windows支持chmod(),但您只能用它设置文件的只读标志(通过stat.s_IWRITE和stat.s_IREAD常量或相应的整数值)忽略所有其他位
对于Windows权限,您可以管理ACL。根据另一个答案改编,您需要pywin32库:
import win32security
import ntsecuritycon as con
FILENAME = r"H:path_to_filefile.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)
将con.FILE_ALL_ACCESS
标志更改为所需的标志。
shell命令中的r字符的意图是什么?你的意思是把它放在整根绳子的前面吗?你检查过哪个文件是通过触摸生成的吗?
当我尝试您的示例时,它运行以下命令:['touch', 'rH:\path_to_filex0cile.txt']
,即创建文件rH:path_to_filefile.txt
这对我来说很好:
command=shlex.split("chmod 777 'H:path_to_filefile.txt'")
subprocess.call(command)
试试这个(我现在没有Linux机器来测试它):
import subprocess
subprocess.call(r'chmod 777 "H:path_to_filefile.txt"', shell=True)
如果文件名是用户提供的,出于安全原因,应避免使用shell=True
。你可以试试:
filename = r"H:path_to_filefile.txt"
subprocess.call(['chmod','777',filename])