使用C扩展返回的文件描述符读取python中的文件

使用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) {

当我尝试用python读取文件时,它会阻止其他进程编辑该文件。即使文件是以读取模式打开的

我找不到能够实现这一目标的方法和选项。所以,我要做的是,将文件名发送到一个C扩展名,并使用必需的选项在那里打开文件,然后从那里返回文件描述符。 并且,使用此描述符获取文件对象并读取文件

我尝试过的代码是:

C代码fileread.h

#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