2011-06-08 5 views
17

J'ai un très gros fichier que j'essaie d'ouvrir avec mmap et qui me donne la permission refusée. J'ai essayé différents drapeaux et modes pour le os.open mais ça ne fonctionne tout simplement pas pour moi.Python mmap 'Autorisation refusée' sous Linux

Qu'est-ce que je fais 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 
>>> 

(en utilisant le construit en open() fonctionne via l'exemple python docs, mais il semble ouvrir plus d'une poignée dans le fichier à la fois en mode lecture & d'écriture. Tout ce que je besoin pour la méthode mmap.mmap est le numéro de dossier , donc je ne suppose que je dois créer un objet file, d'où ma tentative d'utiliser os.open())

+0

Question idiote, mais avez-vous une autorisation de lecture sur le fichier? –

+0

Pourquoi avez-vous ouvert le fichier via 'os.open' plutôt que dans' 'open()'? Taille? Pour ~ 50 Mo de fichiers (peut-être petit par rapport à vous) que j'ai parcouru avec re, le builtin a bien fonctionné pour moi après avoir incorporé 'prot = mmap.PROT_READ' selon Bobby. –

Répondre

30

Je pense que d'une question de drapeaux, essayez d'ouvrir en lecture seule:

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

et mmap.mmap par défaut tente de carte de lecture/écriture, donc qu'élaborer lecture seule:

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

Votre réponse est meilleure. :-) – Nemo

+0

haha, merci. C'est toujours une course par ici :) –

+0

Cest it- thanks :) – tMC

5

Dans mon cas, cette erreur est survenue parce que je tentais d'ouvrir un périphérique bloc sans spécifier une taille explicite.

FWIW vous ne pouvez pas utiliser os.stat/os.fstat avec un dispositif de bloc pour obtenir la taille de l'appareil (ce qui est toujours 0), mais vous pouvez utiliser file.seek et 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

Essayez le réglage du mode de fichier à r+. Cela a fonctionné pour moi sur Linux:

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

Ensuite, cela a fonctionné pour moi comme d'habitude:

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

J'essayais 'open ('foo.txt', 'rwb')'. Merci d'avoir sauvé ma santé mentale. –

+0

@JonathonReinhart; de rien! Les drapeaux n'ont aucun sens pour moi –

0

Le appel multi-plateforme de mmap peut être effectuée en utilisant le paramètre access:

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

Les autorisations de construction mmap doivent être synchronisées avec les autorisations d'ouverture de fichier (lecture, écriture ou lecture/écriture).