24

mmap で開こうとしている非常に大きなファイルがあり、許可が拒否されました。にさまざまなフラグとモードを試しました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
>>> 

(Python docsの例を介して組み込みのopen()機能を使用しますが、読み取りモードと書き込みモードの両方でファイルへの複数のハンドルを開くようです。mmap.mmapメソッドに必要なのはファイル番号だけなので、必要だとは思いませんfileオブジェクトを作成する;したがって、使用しようとする私の試みos.open())

4

4 に答える 4

39

フラグの問題だと思います。読み取り専用として開いてみてください。

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

また、mmap.mmapはデフォルトで読み取り/書き込みをマップしようとするため、読み取り専用でマップします。

mfile = mmap.mmap(mfd, 0, prot=mmap.PROT_READ)
于 2011-06-08T23:56:54.227 に答える
12

ファイルモードを に設定してみてくださいr+。それはLinuxでうまくいきました:

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

その後、これは私にとっては正常に機能しました:

mfile = mmap.mmap(mfd, 0)
于 2013-01-19T22:44:34.907 に答える
5

私の場合、明示的なサイズを指定せずにブロックデバイスを開こうとしたため、このエラーが発生しました。

FWIWブロック デバイスでos.stat/os.fstatを使用してデバイスのサイズ (常に 0) を取得することはできませんが、 file.seekandを使用することはできfile.tellます。

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

m = mmap.mmap(f, size, mmap.MAP_PRIVATE, mmap.PROT_READ)
于 2012-02-11T20:36:01.277 に答える
2

The cross-platform call of mmap can be performed using access parameter:

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

The mmap construction permissions should be synced with the file open permissions (both read, write, or read/write).

于 2016-01-01T23:31:27.797 に答える