使用 C 扩展返回的文件描述符读取 python 中的文件
Using the file descriptor returned from C extension to read the files in python
当我尝试读取 python 中的文件时,它会阻止其他进程编辑该文件。即使文件以读取模式打开。
我找不到可以让我实现这一目标的选项。所以,我想做的是,将文件名发送到 C 扩展名,然后使用所需的选项打开文件,并从那里 return 文件描述符。
并且,使用这个描述符获取文件对象并读取文件。
我试过的代码是:
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!");
}
而且,fileread.py 是:
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
当我尝试在此处执行 fdopen() 时,它会抛出错误。我做错了什么?
默认情况下,Python 不锁定文件,但如果需要,请参阅 fcntl
模块。
但是如果 Python 进程打开了文件,其他锁定文件的进程可能无法获得锁定。 (这是严重依赖 OS 的行为。)
要证明不是 Python 阻止其他进程访问文件,请打开两个不同的终端程序或 cmd windows,在两个程序中启动 Python他们,并打开文件阅读每一个。这应该有效,并且会表明它是另一个进程抱怨它无法打开(并锁定)您的 Python 进程已打开的文件,而不是 Python 本身获取文件的锁定。
一般情况下,最好的处理方法是打开文件,进行文件操作,然后立即关闭它。但是不幸的是,如果您的编辑器不允许其他进程打开文件,那么您将不得不处理这个问题。您应该检查您的编辑器配置设置,看看它是否有一个您可以关闭的独占访问权限,如果没有,您应该考虑使用其他编辑器。
当我尝试读取 python 中的文件时,它会阻止其他进程编辑该文件。即使文件以读取模式打开。
我找不到可以让我实现这一目标的选项。所以,我想做的是,将文件名发送到 C 扩展名,然后使用所需的选项打开文件,并从那里 return 文件描述符。 并且,使用这个描述符获取文件对象并读取文件。
我试过的代码是:
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!");
}
而且,fileread.py 是:
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
当我尝试在此处执行 fdopen() 时,它会抛出错误。我做错了什么?
默认情况下,Python 不锁定文件,但如果需要,请参阅 fcntl
模块。
但是如果 Python 进程打开了文件,其他锁定文件的进程可能无法获得锁定。 (这是严重依赖 OS 的行为。)
要证明不是 Python 阻止其他进程访问文件,请打开两个不同的终端程序或 cmd windows,在两个程序中启动 Python他们,并打开文件阅读每一个。这应该有效,并且会表明它是另一个进程抱怨它无法打开(并锁定)您的 Python 进程已打开的文件,而不是 Python 本身获取文件的锁定。
一般情况下,最好的处理方法是打开文件,进行文件操作,然后立即关闭它。但是不幸的是,如果您的编辑器不允许其他进程打开文件,那么您将不得不处理这个问题。您应该检查您的编辑器配置设置,看看它是否有一个您可以关闭的独占访问权限,如果没有,您应该考虑使用其他编辑器。