我想把我的文件传递给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()
...