2011-03-08 3 views
17


में मैं एक डीआईआर बनाते समय अनुमति समस्याएं अपलोड कर रहा हूं, मैं बस एक अपलोड की गई फाइल को संभालने की कोशिश कर रहा हूं और इसे एक कामकाजी डीआईआर में लिख रहा हूं जिसका नाम सिस्टम टाइमस्टैम्प है। समस्या यह है कि मैं उस निर्देशिका को पूर्ण अनुमति (777) के साथ बनाना चाहता हूं लेकिन मैं नहीं कर सकता! कोड के निम्नलिखित भाग का उपयोग करके बनाई गई निर्देशिका में 755 अनुमतियां हैं।पायथन

def handle_uploaded_file(upfile, cTimeStamp): 
    target_dir = "path_to_my_working_dir/tmp_files/%s" % (cTimeStamp) 
    os.makedirs(target_dir, mode=0777) 

कोई भी मेरी मदद कर सकता है? बहुत धन्यवाद।

+0

आपको क्या त्रुटि मिल रही है? – Ikke

+0

मुझे बस निर्देशिका मिलती है लेकिन गलत अनुमतियों के साथ (777 के बजाय 755)। – green69

उत्तर

23

आधिकारिक अजगर documentationos.makedirs समारोह के मोड तर्क के अनुसार कुछ सिस्टम पर ध्यान नहीं दिया जा सकता है, और प्रणालियों जहां इसे नजरअंदाज नहीं कर रहा है पर वर्तमान umask मूल्य बाहर छिपा होता है।

किसी भी तरह से, आप os.chmod फ़ंक्शन का उपयोग करके मोड को 0o777 (0777 एक वाक्यविन्यास त्रुटि फेंक दिया) पर मजबूर कर सकते हैं।

+6

+1: अप्रत्याशित अनुमतियां दिखाई देने पर 'उमास्क' प्रायः अपराधी होता है। –

+0

मैं सहमत हूं, समस्या शायद उमास्क है - यह निदान शायद सही नहीं है। – dbn

+1

@ डीबीडब्ल्यू मैं इस बात से सहमत हूं कि मौजूदा उमास्क सेटिंग शायद समस्या का कारण है, इसलिए मैंने अपने उत्तर में उमास्क का उल्लेख किया - चमोद का उपयोग करके वैकल्पिक समाधान का वर्णन करने से पहले। – srgerg

8

यूनिक्स सिस्टम के लिए (जब मोड को अनदेखा नहीं किया जाता है) प्रदान किया गया मोड पहले उपयोगकर्ता के उमास्क के साथ मुखौटा होता है। आप इस कोड को चलाने वाले उपयोगकर्ता के umask को भी ठीक कर सकते हैं। तो आपको os.chmod() विधि को कॉल करने की आवश्यकता नहीं होगी। कृपया ध्यान दें, कि यदि आप umask को ठीक नहीं करते हैं और os.makedirs विधि के साथ एक से अधिक निर्देशिकाएं बनाते हैं, तो आपको बनाए गए फ़ोल्डर की पहचान करनी होगी और os.chmod लागू करना होगा।

def supermakedirs(path, mode): 
    if not path or os.path.exists(path): 
     return [] 
    (head, tail) = os.path.split(path) 
    res = supermakedirs(head, mode) 
    os.mkdir(path) 
    os.chmod(path, mode) 
    res += [path] 
    return res 
+0

मैं '/ var /' के अंदर 'test' निर्देशिका बनाने में असमर्थ हूं। –

13

आप समस्याओं में चल रहे हैं क्योंकि os.makedir() वर्तमान प्रक्रिया (see the docs, here) की umask को सम्मानित:

मेरे लिए मैं निम्नलिखित समारोह बनाया। आप umask अनदेखा करना चाहते हैं, तो आप निम्नलिखित की तरह कुछ करना होगा:

import os 
try: 
    original_umask = os.umask(0) 
    os.makedirs('full/path/to/new/directory', desired_permission) 
finally: 
    os.umask(original_umask) 

आपके मामले में, आप desired_permission को 0777 (अष्टाधारी, नहीं स्ट्रिंग) होना चाहता हूँ। अधिकतर उपयोगकर्ता शायद 0755 या 0770 चाहते हैं।

+1

थोड़ा सुधार: umask फ़ाइलों या निर्देशिकाओं की एक संपत्ति नहीं है, यह चल रही प्रक्रिया द्वारा निर्धारित है। आम तौर पर उमास्क को शेल से विरासत में मिलाया जाता है। – Sundae

+0

धन्यवाद, sundae - सत्यापन और अद्यतन। – dbn

+0

@ डीबीडब्ल्यू वाह, चीजें umask बदलकर अपेक्षित काम करती हैं :) लेकिन क्या ऐसा करने का कोई खतरा है? – user3366706