2011-06-08 23 views
17

Tengo un archivo realmente grande que estoy tratando de abrir con mmap y me da permiso denegado. He intentado diferentes banderas y modos en el os.open, pero simplemente no funciona para mí.Python mmap 'Permiso denegado' en Linux

¿Qué estoy haciendo mal?

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

(utilizando el construido en open() obras a través del ejemplo de documentación de Python, pero parece abrir más de una manija para el archivo tanto en el modo & lectura y escritura. Todo lo que necesito para el método mmap.mmap es el número de expediente , por lo que no asumiría que necesito para crear un objeto file, por lo que mi intento de usar os.open())

+0

Pregunta tonta, pero ¿tiene permiso de lectura en el archivo? –

+0

¿Por qué abriste el archivo a través de 'os.open' en lugar del builtin' open() '? ¿Tamaño? Para ~ 50 MB de archivos (puede ser pequeño en relación con usted) que revisé con re, el built-in funcionó bien para mí después de incorporar 'prot = mmap.PROT_READ' según Bobby. –

Respuesta

30

Creo que es cuestión de banderas a, prueba a abrir como de sólo lectura:

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

y mmap.mmap por defecto intenta realizar una asignación de lectura/escritura, por lo que sólo Mapa de sólo lectura:

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

Tu respuesta es mejor. :-) – Nemo

+0

jaja, gracias. siempre es una carrera por aquí :) –

+0

Eso es ... gracias :) – tMC

5

En mi caso ocurrió este error porque yo estaba tratando de abrir un dispositivo de bloque sin especificar un tamaño explícito.

Fwiw no puede utilizar os.stat/os.fstat con un dispositivo de bloque para obtener el tamaño del dispositivo (que es siempre 0), pero se puede usar file.seek y 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

intente configurar el modo de archivos en r+. Eso funcionó para mí en Linux:

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

Entonces esto funcionó para mí lo más normal:

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

Estaba intentando 'abrir ('foo.txt', 'rwb')'. Gracias por salvar mi cordura. –

+0

@JonathonReinhart; ¡De nada! Las banderas no tienen sentido para mí –

0

La llamada multiplataforma de mmap pueden realizarse usando access parámetro:

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

Los permisos de construcción de mmap deben sincronizarse con los permisos de apertura de archivos (tanto de lectura, escritura o lectura/escritura).