shutil.move(scr, dst) 报错 IOError: [Errno 13] 权限被拒绝及其他3个错误

4 投票
2 回答
6472 浏览
提问于 2025-04-18 03:59
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位。

http://en.wikipedia.org/wiki/Setuid

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')

撰写回答