2011-06-08 10 views
17

Mam naprawdę duży plik, który próbuję otworzyć z mmap i jego odmowa przyznania mi uprawnień. Próbowałem różnych flag i trybów do os.open, ale to po prostu nie działa dla mnie.Python mmap 'Odmowa uprawnień' na Linuksie

Co robię źle?

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

(za pomocą wbudowanego w open() prac za pośrednictwem przykład docs Pythona, ale wydaje się, aby otworzyć więcej niż jeden uchwyt do pliku zarówno odczytu trybie & zapisu. Wszystko, co potrzebne do sposobu mmap.mmap jest numer pliku , więc nie będę zakładać, muszę stworzyć file obiektu, stąd moje próby z użyciem os.open())

+0

Głupie pytanie, ale czy masz uprawnienie do odczytu w pliku? –

+0

Dlaczego otworzyłeś plik przez 'os.open' zamiast wbudowanego' open() '? Rozmiar? W przypadku plików ~ 50 MB (może być niewielka w stosunku do ciebie), które przeskanowałem za pomocą polecenia re, wbudowane narzędzie działało dobrze po włączeniu 'prot = mmap.PROT_READ' zgodnie z Bobby. –

Odpowiedz

30

myślę jego flagi problem, spróbuj otworzyć jako tylko do odczytu:

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

i mmap.mmap domyślnie próbuje map odczytu/zapisu, więc wystarczy tylko czytać map:

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

Twoja odpowiedź jest lepsza. :-) – Nemo

+0

haha, dziękuję. to zawsze wyścig tutaj :) –

+0

To jest- dzięki :) – tMC

5

w moim przypadku wystąpił ten błąd, bo usiłował otworzyć urządzenie blokowe bez podania wyraźnej rozmiar.

FWIW nie można używać os.stat/os.fstat z urządzenia blokowego w celu uzyskania wielkości urządzenia (co jest zawsze 0), ale można użyć file.seek i 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

Spróbuj ustawić tryb pliku do r+. Że pracował dla mnie w systemie Linux:

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

Wtedy ten pracował dla mnie, jak zwykle:

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

Próbowałem 'open ('foo.txt', 'rwb')'. Dzięki za uratowanie mojego zdrowia psychicznego. –

+0

@ JonathonReinhart; nie ma za co! Flagi nie mają dla mnie żadnego sensu –

0

Wezwanie wieloplatformowy z mmap można przeprowadzić stosując access parametr:

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

Uprawnienia budowlane mmap powinny być zsynchronizowane z uprawnieniami do otwierania plików (zarówno do odczytu, zapisu, jak i odczytu/zapisu).

Powiązane problemy