33

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'

复制-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从同一文件的命令行运行到同一目标不会导致错误。为什么?

4

4 回答 4

53

失败的操作是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)
于 2012-08-06T21:08:01.043 回答
2

这种形式对我有用:

shutil.copy('/src_path/filename','/dest_path/filename')
于 2019-06-13T13:01:37.833 回答
-1

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

'bin/styles/blacktie/images'

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

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

简而言之,试试这个:

'bin/styles/blacktie/images/'
于 2012-08-06T21:04:17.583 回答
-2

参数必须是:

shutil.copy('src/images/ajax-loader-000000-e3e3e3.gif', 'bin/styles/blacktie/images.ajax-loader-000000-e3e3e3.gif')
于 2018-02-09T08:10:00.560 回答