2012-08-06 17 views
16

shutil.copy() được nâng cao một lỗi cho phép:Tại sao sẽ shutil.copy() nâng cao một ngoại lệ cho phép khi cp không?

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') 

Tôi đang chạy copy-test.py từ dòng lệnh:

python copy-test.py 

Nhưng chạy cp từ dòng lệnh trên cùng một tệp đến cùng một đích sẽ không gây ra lỗi. Tại sao?

+0

Ông có thể viết theo cách bạn bắt đầu kịch bản và có thể mã nguồn của copy-test.py? –

Trả lời

30

Các hoạt động đó là thất bại là chmod, không phải là bản sao của chính nó:

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' 

này chỉ ra rằng tập tin đã tồn tại và được sở hữu bởi một người dùng khác .

shutil.copy được chỉ định để sao chép bit quyền. Nếu bạn chỉ muốn sao chép nội dung tệp, hãy sử dụng shutil.copyfile(src, dst) hoặc shutil.copyfile(src, os.path.join(dst, os.path.basename(src))) nếu dst là một thư mục.

Một chức năng làm việc với dst hoặc là một tập tin hoặc một thư mục và không sao chép bit phép:

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

Tại sao cần phải chmod nó? Tôi có quyền ghi và chỉ muốn cập nhật tệp nếu nó tồn tại. Tôi có phải xóa tệp trước không? Điều đó sẽ rất xấu hổ. –

+0

@JustinY bạn có thể sử dụng 'shutil.copyfile'; xem ở trên. – ecatmur

0

Đây là loại phỏng đoán, nhưng điều đầu tiên mà bật ra nhìn tôi:

'bin/styles/blacktie/images' 

Bạn không có dấu gạch chéo. Mặc dù tôi không chắc chắn về việc triển khai shutil.copy(), tôi có thể cho bạn biết rằng cp sẽ hoạt động khác nhau tùy thuộc vào hệ điều hành bạn đang chạy. Nhiều khả năng, trên hệ thống của bạn, cp là thông minh và nhận thấy rằng images là một thư mục và sao chép tệp vào đó.

Tuy nhiên, nếu không có sự dấu gạch chéo, shutil.copy() chưa giải thích nó như một tập tin, không kiểm tra và nâng cao ngoại lệ khi nó không thể tạo một file có tên images.

Nói tóm lại, hãy thử này:

'bin/styles/blacktie/images/' 
+0

Đoán tốt nhưng thêm dấu gạch chéo không giải quyết được vấn đề của tôi. –

0

luận cứ phải là:

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