2012-05-13 15 views
35

मुझे IOError: [Errno 13] Permission denied मिल रहा है और मुझे नहीं पता कि इस कोड में क्या गलत है।पायथन - IOError: [Errno 13] अनुमति अस्वीकार:

मैं एक निरपेक्ष पथ (जिसका अर्थ है केवल file.asm) दिया एक फ़ाइल को पढ़ने के लिए कोशिश कर रहा हूँ

और एक रिश्तेदार पथ (/.../file.asm अर्थ), और मैं इस कार्यक्रम जो भी रास्ता दिया जाता है करने के लिए फ़ाइल लिखना चाहते हैं - यदि यह पूर्ण है, तो इसे वर्तमान डीआईआर को लिखना चाहिए; अन्यथा, दिए गए पथ के लिए।

कोड:

#call to main function 
if __name__ == '__main__': 
    assem(sys.argv[1]) 


import sys 

def assem(myFile): 
    from myParser import Parser 
    import code 
    from symbolTable import SymbolTable 

    table=SymbolTable() 

    # max size of each word 
    WORD_SIZE = 16 
    # rom address to save to 
    rom_addrs = 0 
    # variable address to save to 
    var_addrs = 16 

    # new addition 
    if (myFile[-4:] == ".asm"): 
     newFile = myFile[:4]+".hack" 

    output = open(newFile, 'w') <==== ERROR 

त्रुटि दिया:

IOError: [Errno 13] Permission denied: '/Use.hack' 

तरह से मैं कोड निष्पादित करें:

python assembler.py Users/***/Desktop/University/Add.asm 

क्या मैं गलत यहाँ कर रहा हूँ?

+2

शायद आपके पास मूल निर्देशिका में लिखने के लिए प्रमोशन नहीं हैं - और ठीक है, ऐसा लगता है कि – Ingo

उत्तर

15

ऐसा लगता है कि आप निम्न कोड के साथ विस्तार को बदलने के लिए कोशिश कर रहे हैं:

if (myFile[-4:] == ".asm"): 
    newFile = myFile[:4]+".hack" 

हालांकि, अगर आप को मिलाया सरणी अनुक्रमित दिखाई देते हैं। निम्नलिखित का प्रयास करें:

if (myFile[-4:] == ".asm"): 
    newFile = myFile[:-4]+".hack" 

नोट कोड की दूसरी पंक्ति में सिर्फ 4 के बजाय -4 का उपयोग। यह बताता है कि आपका प्रोग्राम /Use.hack बनाने का प्रयास क्यों कर रहा है, जो पहले आपके फ़ाइल नाम के चार वर्ण (/Use) है, जिसमें .hack शामिल है।

+0

हाँ, आप सही हैं। लेकिन अब मुझे मिलता है: IOError: [Errno 2] ऐसी कोई फ़ाइल या निर्देशिका नहीं: 'उपयोगकर्ता/itzikhanoch/डेस्कटॉप/विश्वविद्यालय/Add.hack' 'w' का उपयोग कर मैं उसे कोई फ़ाइल क्यों ढूंढूं? इसे लिखना चाहिए। – Itzik984

+3

अब ऐसा लगता है कि आप 'उपयोगकर्ता/...' के बजाय 'उपयोगकर्ता/...' पास कर रहे हैं। प्रमुख स्लैश पर ध्यान दें, यह महत्वपूर्ण है। अग्रणी स्लैश के बिना, आप 'उपयोगकर्ता' नामक वर्तमान निर्देशिका * की उपनिर्देशिका में एक फ़ाइल खोलने की कोशिश कर रहे हैं। –

9

आपके पास रूट निर्देशिका में लिखने के लिए पर्याप्त अनुमति नहीं है। फ़ाइल नाम पर अग्रणी स्लैश देखें?

+0

क्या ऐसा कुछ है जो मैं इसके बारे में कर सकता हूं? मैं इसे अपने डेस्कटॉप पर एक साधारण फ़ोल्डर में लिख रहा हूं, कुछ खास नहीं – Itzik984

+2

बस शुरुआत में '/' को हटाने का प्रयास करें। – Ashe

+5

जानें कि एक पूर्ण और सापेक्ष पथ क्या है - आप उन्हें गलत मानते हैं। जानें कि एक पथ जैसे/foo का नेतृत्व करेंगे। – Ingo

-1

बेशक आप कर सकते हैं। इस लाइन को बदलने के लिए प्रयास करें:

output = open(newFile, 'w') 

रहे हैं:

output = open("./%s" % (newFile), 'w') 

यह स्थानीय निर्देशिका में अपनी फ़ाइल को सहेजने चाहिए।

+0

अब यह कुछ भी लिख नहीं पाएगा ... फ़ाइल को कहीं भी नहीं ढूंढ सकता – Itzik984

+0

@ Itzik984: अगर आपको कोई त्रुटि नहीं मिली है, तो फ़ाइल * कहीं * लिखा गया था। वह कहीं भी उस प्रक्रिया की वर्तमान कार्यशील निर्देशिका होगी जो फ़ाइल लिखती है। –

+0

@ ग्रेगहेविल आप सही हैं। माफ़ कीजिये। लेकिन फिर भी, मुझे इसे दिए गए पथ में लिखा जाना चाहिए, वर्तमान कामकाजी डीआईआर नहीं ... – Itzik984

23

बस खोले गए फ़ाइल को बंद करें जहां आप लिखने जा रहे हैं।

+1

यह उत्तर प्रश्न के लिए कोई समझ नहीं आता है ... – duskwuff

4

यह तब हुआ जब मैं 'shutil.copy' के बजाय 'shutil.copyfile' का उपयोग कर रहा था। अनुमतियों को गड़बड़ कर दिया गया था।

-2

मेरे लिए, यह एक अनुमति समस्या थी।

उस विशिष्ट फ़ोल्डर पर 'स्वामित्व लें' एप्लिकेशन का उपयोग करें। हालांकि, यह कभी-कभी केवल अस्थायी रूप से काम करता प्रतीत होता है और यह स्थायी समाधान नहीं है।

संबंधित मुद्दे