使用C扩展返回的文件描述符读取python中的文件
当我尝试用python读取文件时,它会阻止其他进程编辑该文件。即使文件是以读取模式打开的 我找不到能够实现这一目标的方法和选项。所以,我要做的是,将文件名发送到一个C扩展名,并使用必需的选项在那里打开文件,然后从那里返回文件描述符。 并且,使用此描述符获取文件对象并读取文件 我尝试过的代码是: C代码fileread.h使用C扩展返回的文件描述符读取python中的文件,c,windows,python-2.7,cross-platform,C,Windows,Python 2.7,Cross Platform,当我尝试用python读取文件时,它会阻止其他进程编辑该文件。即使文件是以读取模式打开的 我找不到能够实现这一目标的方法和选项。所以,我要做的是,将文件名发送到一个C扩展名,并使用必需的选项在那里打开文件,然后从那里返回文件描述符。 并且,使用此描述符获取文件对象并读取文件 我尝试过的代码是: C代码fileread.h #include <python.h> static PyObject* fileread(PyObject *self, PyObject *args) {
#include <python.h>
static PyObject* fileread(PyObject *self, PyObject *args)
{
char* filename = NULL;
int fd = 0;
if (!PyArg_ParseTuple(args, "s", &filename)) {
return NULL;
}
fd = _sopen(filename, 0x0000, 0x40, 0x0100);
// _sopen(filename,_O_RDONLY, _SH_DENYNO, _S_IREAD);
return Py_BuildValue("i", fd);
}
static PyMethodDef fileread_funcs[] = {
{ "fileread", (PyCFunction)fileread,
METH_VARARGS, "read file in blocks" },
{ NULL, NULL, 0, NULL }
};
void initfileread(void)
{
Py_InitModule3("fileread", fileread_funcs,
"Extension for file read!");
}
当我尝试在这里执行fdopen()时,它会抛出一个错误。我做错了什么?默认情况下,Python不会锁定文件,但如果需要,请参阅
fcntl
模块
但是,如果Python进程打开了一个文件,那么其他不锁定文件的进程可能无法获得锁。(这是严重依赖操作系统的行为。)
要证明阻止另一进程访问该文件的不是Python,请打开两个不同的终端程序或cmd窗口,在这两个程序中启动Python,然后在每个程序中打开该文件进行读取。这应该是可行的,并且将表明是另一个进程抱怨它无法打开(并锁定)Python进程已打开的文件,而不是Python本身获得了文件的锁定
一般来说,处理此问题的最佳方法是打开文件,执行文件操作,然后立即再次关闭。但不幸的是,如果编辑器不允许其他进程打开文件,这将是您必须处理的问题。你应该检查你的编辑器配置设置,看看它是否有一个独占访问,你可以关闭它,如果不是,你应该考虑一个不同的编辑器。默认情况下,Python不锁定文件,但是如果需要的话,请参阅<代码> FCNTL < /代码>模块。 但是,如果Python进程打开了一个文件,那么其他不锁定文件的进程可能无法获得锁。(这是严重依赖操作系统的行为。) 要证明阻止另一进程访问该文件的不是Python,请打开两个不同的终端程序或cmd窗口,在这两个程序中启动Python,然后在每个程序中打开该文件进行读取。这应该是可行的,并且将表明是另一个进程抱怨它无法打开(并锁定)Python进程已打开的文件,而不是Python本身获得了文件的锁定
一般来说,处理此问题的最佳方法是打开文件,执行文件操作,然后立即再次关闭。但不幸的是,如果编辑器不允许其他进程打开文件,这将是您必须处理的问题。你应该检查你的编辑器配置设置,看看它是否有一个独占访问,你可以关闭它,如果不是,你应该考虑一个不同的编辑器。在你声称Python阻止其他进程访问文件之前,试着打开它,同时从两个不同的Python进程中读取。这对我来说在Linux上很好…对不起,我应该提到它在windows上的功能。我试着从python脚本中读取一个文件。当我试图同时编辑和保存文件时,它不允许我这样做。但这是您的编辑器,还是Python?要排除Python,请打开两个不同的cmd窗口,在这两个窗口中启动Python,然后在每个窗口中打开文件进行读取。如果这样做有效,那么是您的编辑器抱怨它无法打开另一个进程已打开的文件。确定。我会试试的。谢谢你是对的。谢谢。在您声明Python阻止其他进程访问该文件之前,请尝试从两个不同的Python进程同时打开它进行读取。这对我来说在Linux上很好…对不起,我应该提到它在windows上的功能。我试着从python脚本中读取一个文件。当我试图同时编辑和保存文件时,它不允许我这样做。但这是您的编辑器,还是Python?要排除Python,请打开两个不同的cmd窗口,在这两个窗口中启动Python,然后在每个窗口中打开文件进行读取。如果这样做有效,那么是您的编辑器抱怨它无法打开另一个进程已打开的文件。确定。我会试试的。谢谢你是对的。谢谢
import os
import fileread
def ReadDataBlockByBlock(dirPath, fileName):
path = os.path.join(dirPath, fileName)
if os.access(path, os.R_OK):
fd = PyObjectAsFileDescriptor(fileread.fileread(path))
fp = os.fdopen(fd,'r') #Is Error: Expects integer
for block in read_in_chunks(fp):
print block
print '*' * 80
os.close(fd)
def read_in_chunks(file_object, chunk_size=1096):
"""Function (generator) to read a file piece by piece.
Default chunk size: 1k."""
while True:
data = os.read(file_object, chunk_size)
if not data:
break
yield data