Python 读取使用O_DIRECT标志打开的文件

Python 读取使用O_DIRECT标志打开的文件,python,caching,Python,Caching,我需要在不影响缓存的情况下读取文件。因此,我使用带有O_DIRECT标志的os.open()打开文件,并使用os.read()以如下方式读取: import os, sys fd = os.open( "foo.txt", os.O_RDONLY|os.O_DIRECT) # fd = os.open( "foo.txt", os.O_RDONLY) readBytes = os.read(fd, os.path.getsize("foo.txt

我需要在不影响缓存的情况下读取文件。因此,我使用带有O_DIRECT标志的os.open()打开文件,并使用os.read()以如下方式读取:

import os, sys
fd = os.open( "foo.txt", os.O_RDONLY|os.O_DIRECT)
# fd = os.open( "foo.txt", os.O_RDONLY)
readBytes = os.read(fd, os.path.getsize("foo.txt"))
print(readBytes)
os.close( fd)
问题是,如果我使用os.O_直接标记代码,代码将无法工作

Traceback (most recent call last):
  File "test.py", line 3, in <module>
    readBytes = os.read(fd, os.path.getsize("foo.txt"))
OSError: [Errno 22] Invalid argument
回溯(最近一次呼叫最后一次):
文件“test.py”,第3行,在
readBytes=os.read(fd,os.path.getsize(“foo.txt”))
OSError:[Errno 22]参数无效

但是,如果我删除这个标志(注释中的行),它工作得非常好!请建议

您的文件系统不支持
O_DIRECT
标志


$man打开
并查看错误部分。

你能说出你想要什么而不说“缓存”吗?这听起来像是一个X/Y问题。简而言之,所谓避免缓存,我指的是直接I/O。对于这种情况,请假设,我需要使os.open with O_direct标志与os.read:)我的意思是,你能问一下你希望做什么,而不是问你如何解决你试图做的事情的答案吗。想要避免缓存是非常奇怪的,而且闻起来很有趣。而且
read
syscall不会给你所有的字节,你也不会检查你有多少字节@查德米勒:我正在读的文件是一个非常小的文件。您能解释一下为什么read syscall不会给出所有字节吗?关于缓存,我想消除或减少缓存效果,或者换句话说,我想确保文件是直接读取的,而不是从缓存返回的。read()可以提供任意数量的字节。您指定的数字是您愿意接受的最大值。我查看了手册页,它似乎在内核版本2.4.10的Linux下受支持。我的是3.x.x。那么它不应该在那里吗?我也没有看到任何类似于我的错误!搜索单词“ERRORS”和“EINVAL”。