为什么会shutil.copy()时,CP不​​养许可例外?(Why would shutil.co

2019-06-26 19:35发布

shutil.copy()是提高权限错误:

Traceback (most recent call last):
  File "copy-test.py", line 3, in <module>
    shutil.copy('src/images/ajax-loader-000000-e3e3e3.gif', 'bin/styles/blacktie/images')
  File "/usr/lib/python2.7/shutil.py", line 118, in copy
    copymode(src, dst)
  File "/usr/lib/python2.7/shutil.py", line 91, in copymode
    os.chmod(dst, mode)
OSError: [Errno 1] Operation not permitted: 'bin/styles/blacktie/images/ajax-loader-000000-e3e3e3.gif'

copy-test.py:

import shutil

shutil.copy('src/images/ajax-loader-000000-e3e3e3.gif', 'bin/styles/blacktie/images')

我运行命令行copy-test.py:

python copy-test.py

但运行cp从同一个文件到同一目的地的命令行不会导致错误。 为什么?

Answer 1:

发生故障的操作chmod ,而不是复制自身:

  File "/usr/lib/python2.7/shutil.py", line 91, in copymode
    os.chmod(dst, mode)
OSError: [Errno 1] Operation not permitted: 'bin/styles/blacktie/images/ajax-loader-000000-e3e3e3.gif'

这表明该文件已经存在,并已被其他用户所拥有。

shutil.copy被指定为权限位复制。 如果你只想要的文件内容被复制,使用shutil.copyfile(src, dst)shutil.copyfile(src, os.path.join(dst, os.path.basename(src)))如果dst是目录。

与之配合的函数dst是一个文件或目录,并且不复制的权限:

def copy(src, dst):
    if os.path.isdir(dst):
        dst = os.path.join(dst, os.path.basename(src))
    shutil.copyfile(src, dst)


Answer 2:

这是怎样的一个猜测,但我弹出的第一件事:

'bin/styles/blacktie/images'

你有没有尾随斜线。 虽然我不知道的实施shutil.copy()我可以告诉你, cp将采取不同取决于什么操作系统你运行它。 最有可能的,您的系统上, cp是聪明,有注意到, images是一个目录,并将文件复制到它。

然而,如果没有最后的斜线, shutil.copy()可能将其解释为一个文件, 检查,提高异常时,它无法创建一个文件名为images

总之,试试这个:

'bin/styles/blacktie/images/'


Answer 3:

参数必须是:

shutil.copy('src/images/ajax-loader-000000-e3e3e3.gif', 'bin/styles/blacktie/images.ajax-loader-000000-e3e3e3.gif')


文章来源: Why would shutil.copy() raise a permission exception when cp doesn't?