web-dev-qa-db-ja.com

cpがそうでないのに、shutil.copy()が許可例外を発生させるのはなぜですか?

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を実行しても、エラーは発生しません。どうして?

27
user879121

失敗している操作は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)
_
39
ecatmur

このフォームは私にとってうまくいきました:

shutil.copy('/src_path/filename','/dest_path/filename')
0
Mebrahtom Guesh

引数は次のとおりでなければなりません:

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

これは推測のようなものですが、最初に浮かび上がるのは次のとおりです。

_'bin/styles/blacktie/images'
_

末尾にスラッシュはありません。 shutil.copy()の実装についてはわかりませんが、cpは、実行しているOSによって動作が異なると言えます。ほとんどの場合、システム上でcpは賢く、imagesがディレクトリであることを認識し、ファイルをそこにコピーしています。

ただし、末尾にスラッシュがない場合、shutil.copy()はそれをファイルとして解釈し、notチェックし、imagesという名前のファイルを作成できない場合に例外を発生させます。 。

要するに、これを試してください:

_'bin/styles/blacktie/images/'
_
0
Izkata