2011-06-08 14 views
17

पर मेरे पास वास्तव में बड़ी फ़ाइल है जिसे मैं एमएमएपी के साथ खोलने की कोशिश कर रहा हूं और मुझे अनुमति देने से इनकार कर रहा है। मैंने os.open पर विभिन्न झंडे और मोडों का प्रयास किया है, लेकिन यह सिर्फ मेरे लिए काम नहीं कर रहा है।लिथॉन एमएमएपी 'अनुमति अस्वीकार' लिनक्स

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

>>> import os,mmap 
>>> mfd = os.open('BigFile', 0) 
>>> mfile = mmap.mmap(mfd, 0) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
mmap.error: [Errno 13] Permission denied 
>>> 

(का उपयोग कर अजगर डॉक्स उदाहरण के माध्यम से काम करता है open() में बनाया गया है, लेकिन यह फाइल करने के लिए एक से अधिक संभाल खोलने के लिए दोनों को पढ़ने & राइट मोड में लगता है। सभी मैं mmap.mmap विधि के लिए की जरूरत है फ़ाइल नंबर , इसलिए मैं मैं एक file वस्तु बनाने की जरूरत मान नहीं होता; os.open() का उपयोग करने में मेरी प्रयास)

+0

बेवकूफ सवाल, लेकिन क्या आपके पास फ़ाइल पर पढ़ने की अनुमति है? –

+0

आपने निर्मित 'ओपन()' के बजाय 'os.open' के माध्यम से फ़ाइल क्यों खोली? आकार? ~ 50 एमबी फाइलों के लिए (आपके लिए छोटा सा सापेक्ष हो सकता है) जिसे मैंने फिर से स्कैन किया था, बॉबी ने बॉबी के अनुसार 'prot = mmap.PROT_READ' को शामिल करने के बाद मेरे लिए ठीक काम किया था। –

उत्तर

30

मुझे लगता है कि इसकी एक झंडे मुद्दा, खोलने की कोशिश के रूप में केवल पढ़ने के लिए इसलिए:

mfd = os.open('BigFile', os.O_RDONLY) 

और डिफ़ॉल्ट रूप से mmap.mmap पढ़ने/लिखने मैप करने के लिए कोशिश करता है, तो बस केवल पढ़ने के लिए नक्शा:

mfile = mmap.mmap(mfd, 0, prot=mmap.PROT_READ) 
+0

आपका उत्तर बेहतर है। :-) – Nemo

+0

हाहा, धन्यवाद। यह हमेशा यहाँ के आसपास एक दौड़ :) –

+0

यह बात करता है- धन्यवाद :) – tMC

5

मेरे मामले क्योंकि मैं एक स्पष्ट आकार निर्दिष्ट किए बिना एक ब्लॉक युक्ति को खोलने के लिए प्रयास कर रहा था यह त्रुटि उत्पन्न हुई हैं।

FWIW आप एक ब्लॉक डिवाइस के साथ os.stat/os.fstat उपयोग कर सकते हैं नहीं उपकरण के आकार (जो हमेशा 0 है) प्राप्त करने के लिए, लेकिन आप file.seek और file.tell उपयोग कर सकते हैं:

f = file("/dev/loop0", "rb") 
f.seek(0, 2) # Seek relative to end of file 
size = fh.tell() 
fh = f.fileno() 

m = mmap.mmap(fh, size, mmap.MAP_PRIVATE, mmap.PROT_READ) 
4

r+ करने के लिए फ़ाइल मोड सेट करके देखें। यही कारण है कि लिनक्स पर मेरे लिए काम किया:

mfd = os.open('BigFile', "r+") 

तो यह सामान्य रूप में मेरे लिए काम किया:

mfile = mmap.mmap(mfd, 0) 
+0

मैं 'ओपन (' foo.txt ',' rwb ')' की कोशिश कर रहा था। मेरी सैनिटी बचाने के लिए धन्यवाद। –

+0

@ जोनाथन रेनहार्ट; आपका स्वागत है! झंडे मुझे कोई समझ नहीं आता है –

0

पार मंच कॉल mmap कीaccess पैरामीटर का उपयोग किया जा सकता है:

mfd = os.open('BigFile', os.O_RDONLY) 
mm = mmap.mmap(mfd, 0, access=mmap.ACCESS_READ) 

एमएमएपी निर्माण अनुमतियों को फ़ाइल खुली अनुमतियों (दोनों पढ़ना, लिखना, या पढ़ना/लिखना) के साथ समन्वयित किया जाना चाहिए।

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