2011-06-08 18 views
17

Ho un file molto grande che sto cercando di aprire con mmap e che mi sta dando il permesso negato. Ho provato diverse bandiere e modalità per il os.open ma non funziona proprio per me.Python mmap 'Autorizzazione negata' su Linux

Cosa sto sbagliando?

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

(utilizzando il costruito nel open() opere attraverso l'esempio docs pitone, ma sembra aprire più di una maniglia per il file sia in modalità & scrittura. All i need per il metodo mmap.mmap è il numero di file , in modo da non pensare ho bisogno di creare un oggetto file; da qui il mio tentativo di utilizzare os.open())

+0

Domanda sciocca, ma hai il permesso di lettura sul file? –

+0

Perché hai aperto il file tramite 'os.open' piuttosto che il builtin' open() '? Dimensione? Per i file da ~ 50 MB (potrebbero essere piccoli rispetto a te) che ho scansionato con re, il builtin ha funzionato bene per me dopo aver incorporato 'prot = mmap.PROT_READ' come da Bobby. –

risposta

30

credo che il suo problema bandiere a, provare ad aprire in sola lettura:

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

e mmap.mmap per default cerca di mappare lettura/scrittura, quindi basta mappa di sola lettura:

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

La tua risposta è migliore. :-) – Nemo

+0

haha, grazie. è sempre una gara qui intorno :) –

+0

Ecco ...- grazie :) – tMC

5

Nel mio caso si è verificato questo errore perché stavo cercando di aprire un dispositivo a blocchi senza specificare una dimensione esplicita.

FWIW non è possibile utilizzare os.stat/os.fstat con un dispositivo a blocchi per ottenere dimensioni del dispositivo (che è sempre 0), ma è possibile utilizzare file.seek e 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

provare a impostare la modalità file a r+. Che ha lavorato per me su Linux:

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

Allora questo ha lavorato per me come al solito:

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

Stavo provando 'open ('foo.txt', 'rwb')'. Grazie per aver salvato la mia sanità mentale. –

+0

@JonathonReinhart; prego! Le bandiere non hanno senso per me –

0

La chiamata multipiattaforma di mmap può essere eseguita utilizzando access parametro:

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

Le autorizzazioni di costruzione di mmap devono essere sincronizzate con le autorizzazioni di apertura del file (sia in lettura, scrittura o lettura/scrittura).

Problemi correlati