当 cp 没有时,为啥 shutil.copy() 会引发权限异常?

Posted

技术标签:

【中文标题】当 cp 没有时,为啥 shutil.copy() 会引发权限异常?【英文标题】:Why would shutil.copy() raise a permission exception when cp doesn't?当 cp 没有时,为什么 shutil.copy() 会引发权限异常? 【发布时间】:2012-08-03 20:52:36 【问题描述】:

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'

复制测试.py:

import shutil

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

我正在从命令行运行 copy-test.py:

python copy-test.py

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

【问题讨论】:

能否请你写下你启动脚本的方式,或者copy-test.py的源代码? 【参考方案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),如果dst 是目录,请使用shutil.copyfile(src, os.path.join(dst, os.path.basename(src)))

一个与dst 一起工作的函数,无论是文件还是目录,并且不复制权限位:

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

【讨论】:

@JustinY 你可以使用shutil.copyfile;见上文。 这很有帮助,准确的解释!【参考方案2】:

这个表格对我有用:

shutil.copy('/src_path/filename','/dest_path/filename')

【讨论】:

要详细说明,您必须将目标指定为文件路径。 IE。你不能只复制到目录路径!【参考方案3】:

这是一种猜测,但我首先想到的是:

'bin/styles/blacktie/images'

你没有尾部斜杠。虽然我不确定shutil.copy() 的实现,但我可以告诉你cp 会根据你运行它的操作系统而有所不同。很可能,在您的系统上,cp 很聪明并注意到 images 是一个目录,并将文件复制到其中。

但是,如果没有尾部斜杠,shutil.copy() 可能会将其解释为文件,检查,并在无法创建名为 images 的文件时引发异常。

简而言之,试试这个:

'bin/styles/blacktie/images/'

【讨论】:

猜对了,但添加斜杠并没有解决我的问题。【参考方案4】:

参数必须是:

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

【讨论】:

以上是关于当 cp 没有时,为啥 shutil.copy() 会引发权限异常?的主要内容,如果未能解决你的问题,请参考以下文章

运维应用

shutil 模块中 shutil.copy()、shutil.rmtree()、shutil.move()等基本函数用法介绍!

shutil.copy()用法

python shutil.copy()用法

shutil学习

python shutil 模块