将python 3打开的文件对象作为file *传递给C函数



我想把我的文件传递给C函数。我对此有意见。我看到了"分割错误"。C代码:

// cc -fPIC -shared -o w.so w.c
#include <stdio.h>
void my_writer(FILE *fp, int num) {
fprintf(fp, "%dn", num);
}
我的python代码:
#!/usr/bin/python3
#
from ctypes import *
so_file = "./w.so"
my_c_writer = CDLL(so_file)
my_num = 2022
try:
convert_file = pythonapi.PyObject_AsFileDescriptor
convert_file.argtypes = [py_object]
convert_file.restype = c_int
# fp = open('path').fp     there is no .fp attribute!
fp = open('num.txt', 'w')
c_file = convert_file(fp)
my_c_writer.my_writer(c_file, c_int(my_num))
fp.close()
except Exception as e:
print(e)
我找了很多,但什么也没找到。C代码文件是不可更改的。如果你能帮助我,我将非常感激。

正如Mark提到的,Python模块中的c_file是一个文件描述符,而不是FILE*。在我用c写了一个包装器函数之后,我能够让代码工作。

void my_writer_wrapper(int fildes, int num) {
FILE *fp = fdopen(fildes, "w");
my_writer(fp, num);
fflush(fp);
}

不直接使用my_writer,您可以使用包装器:

...
fp = open('num.txt', 'w')
c_file = convert_file(fp)
my_c_writer.my_writer_wrapper(c_file, c_int(my_num))
fp.close()
...

相关内容

  • 没有找到相关文章

最新更新