2012-08-06 16 views
16

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:

python copy-test.py 
:

import shutil 

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

मैं कमांड लाइन से copy-test.py चला रहा हूँ

लेकिन उसी फ़ाइल पर उसी फ़ाइल पर कमांड लाइन से cp चल रहा है, जो किसी त्रुटि का कारण नहीं है। क्यूं कर?

+0

आप कृपया जिस तरह से आप स्क्रिप्ट शुरू लिखा जा सका और शायद copy-test.py का स्रोत कोड? –

उत्तर

30

आपरेशन कि विफल हो रहा है 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) 
+1

इसे chmod करने की आवश्यकता क्यों है? मेरे पास लिखने की अनुमति है और यदि यह मौजूद है तो फ़ाइल को अपडेट करना चाहते हैं। क्या मुझे पहले फ़ाइल को हटाना है? वह लंगड़ा होगा। –

+0

@ जस्टिनवाई आप 'shutil.copyfile' का उपयोग कर सकते हैं; ऊपर देखो। – ecatmur

0

यह एक अनुमान की तरह है, लेकिन पहली बात यह है कि मुझ पर बाहर पॉप:

'bin/styles/blacktie/images' 

आप कोई स्लैश है। हालांकि मुझे shutil.copy() के कार्यान्वयन के बारे में निश्चित नहीं है, मैं आपको बता सकता हूं कि cp आप किस ओएस पर इसे चला रहे हैं इसके आधार पर अलग-अलग कार्य करेंगे। सबसे अधिक संभावना है कि, आपके सिस्टम पर, cp स्मार्ट और ध्यान दे रहा है कि images एक निर्देशिका है, और फ़ाइल को इसमें कॉपी कर रहा है।

हालांकि, स्लैश के बिना, shutil.copy() यह एक फ़ाइल के रूप में, की व्याख्या की जा सकती है नहीं जाँच, और जब यह images नामक एक फ़ाइल बनाने में असमर्थ है अपवाद को ऊपर उठाने।

संक्षेप में, इस प्रयास करें:

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

अच्छा अनुमान है लेकिन पिछली स्लैश जोड़ने से मेरी समस्या हल नहीं हुई है। –

0

तर्क होना चाहिए:

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