shutil.move(scr, dst) 报错 IOError: [Errno 13] 权限被拒绝及其他3个错误
Documents = ['*pdf', '*docx', '*txt']
for i in range(len(Documents)):
if glob.glob(Documents[i]):
print(Documents[i], True)
shutil.move(glob.glob(Documents[i])[0], '/home')
else:
print(Documents[i], False)
一切都进行得很顺利,直到:
shutil.move(glob.glob(Documents[i])[0], '/home')
这基本上是:
shutil.move(scr, dst)
然后出现了这个错误:
*pdf False
*docx True
Traceback (most recent call last):
File "/usr/lib/python3.2/shutil.py", line 326, in move
os.rename(src, real_dst)
OSError: [Errno 13] Permission denied
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "teste.py", line 19, in <module>
shutil.move(glob.glob(Documents[i])[0], '/home')
File "/usr/lib/python3.2/shutil.py", line 334, in move
copy2(src, real_dst)
File "/usr/lib/python3.2/shutil.py", line 146, in copy2
copyfile(src, dst)
File "/usr/lib/python3.2/shutil.py", line 99, in copyfile
with open(dst, 'wb') as fdst:
IOError: [Errno 13] Permission denied: '/home/jesus.docx'
我尝试在源路径和目标路径中使用绝对路径,但还是不行。我在网上查了一下,发现这可能和权限有关,但如果我必须更改权限,那就违背了我写这个脚本的初衷。因此,我想在处理权限问题之前先在这里寻求帮助。
那么,我该怎么办呢?
我的目的是在Linux用户的目录中移动文件。(根据文件格式进行分类……)比如说,.jpg 文件要放到图片文件夹,.pdf 文件要放到文档文件夹,等等。(这就是我不想碰权限问题的原因……)
另外,我还是编程新手(这样你们就不会觉得我太专业 :D)这也是我在这个社区的第一个问题,所以如果我听起来有点迷茫或重复,请多多包涵。谢谢!
2 个回答
1
你希望运行你脚本的用户能够以更高的权限来执行它。这里有一个叫做setuid位(设置用户ID)的东西,当它被设置后,脚本就会以拥有者的权限来运行。还有一个叫setgid位(设置组ID)的东西。
要设置这些位,你需要以root用户身份执行以下命令:
chown root scriptname
chmod ug+s scriptname
这个命令会同时设置setuid位和setgid位。
4
你正在尝试把文件写到 /home
这个目录里,但其实不应该这么做。
Linux 是一个多用户的操作系统。/home
目录是所有用户的个人目录所在的地方。每个用户在 /home
下应该有自己的文件夹。例如,你的文件夹可能是 /home/Joao
。
把这一行的最后一个参数改成
shutil.move(glob.glob(Documents[i])[0], '/home')
改成
shutil.move(glob.glob(Documents[i])[0], '/home/your_username')
这里有个总体的改进建议:
# Variable names are lower case
documents = ["*.pdf", "*.docx", "*.txt"]
# You iterate over a for loop like this. Python's for is like for-each. You get the actual item.
for doc in documents:
if glob.glob(doc):
shutil.move(glob.glob(doc)[0], '/home/your_username/Documents')