【问题标题】:shutil.move(scr, dst) gets me IOError: [Errno 13] Permission denied and 3 more errorsshutil.move(scr, dst) 得到我 IOError: [Errno 13] Permission denied 和另外 3 个错误
【发布时间】:2014-04-23 19:25:09
【问题描述】:
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'

我尝试在 scr 和 dst 中都使用绝对路径,但没有成功。我浏览了网页,发现它可能与权限有关,但如果我必须更改权限,它将破坏脚本的目的,这就是为什么我会在进入权限之前尝试在这里寻求帮助。

那么,我该怎么办?

我的目的是移动 Linux 用户目录中的文件。 (根据文件格式对其进行排序..)...ex-> .jpg --> 图片、.pdf --> 文档等。 (这就是为什么我不能获得许可来强化生活......)

我也是编程的新手(只是为了让你们不要变得非常怪异:D) 而且,这也是我在这个社区的第一个问题,所以如果我听起来迷路或退缩,请耐心等待?谢谢

【问题讨论】:

    标签: python permission-denied shutil


    【解决方案1】:

    您正在尝试将文件写入/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')
    

    【讨论】:

    • 只是想额外感谢您对 for 事物的额外提示。
    【解决方案2】:

    您希望运行您的脚本的用户能够以提升的权限运行它。有一个叫做 setuid 位(设置用户 ID)的东西,当设置它时,它将以所有者的权限运行脚本。还有一个setgid(设置组id)位。

    要设置它们,请成为 root 并执行:

    chown root scriptname
    chmod ug+s scriptname
    

    这会同时设置 setuid 位和 setgid 位。

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

    【讨论】:

      猜你喜欢
      • 2012-07-01
      • 2013-06-07
      • 2016-02-28
      • 2018-08-15
      • 2015-11-21
      • 1970-01-01
      • 2014-05-03
      • 2018-07-21
      相关资源
      最近更新 更多