我想从 python 模块准备一个共享对象(.so)。我遇到了 Cython,它 a) 首先将 *.pyx 模块转换为 *.c 代码,b) 然后这个 *.c 代码将转换为共享对象 (.so)。Cython 的所有示例都说明了如何将这个 .so 导入到 python 中。
\n\n但是,我有兴趣从 C 代码中读取这个共享对象。当我编写示例 C 代码来读取 .so 时,它会抛出一个错误,指出 .pyx 中实际存在的方法并不存在于 .so 对象中。
\n\n我想知道 \na) 是否可以从不同的语言(例如 C)读取 Cython 的共享对象 \nb) 而且,如果上述语句为 True,我必须在代码中进行哪些更改,以便我将能够从 C 读取共享对象。
\n\n谢谢,
\n\nPython代码(保存为square_number.pyx)
\n\ndef square_me(int x):\n return x * x\nRun Code Online (Sandbox Code Playgroud)\n\nCython 对应的 setup.py 文件
\n\nfrom distutils.core import setup\nfrom Cython.Build import cythonize\n\nsetup(\n ext_modules=cythonize("square_number.pyx"),\n )\nRun Code Online (Sandbox Code Playgroud)\n\n将上述 .pyx 转换为 .So 的命令行语句(通过 cython)
\n\npython setup.py build_ext --inplace\nRun Code Online (Sandbox Code Playgroud)\n\n这将在同一文件夹中创建一个 square_number.so 。现在,我将其重命名为 libSquareNumber.so
\n\n用于读取.so的C代码
\n\n#include<stdio.h>\n\nint main(int argc,char *argv[])\n{\n int result;\n\n result=square_me(2);\n\n printf("Sum of entered numbers = %d\\n",result);\n\n return 0;\n }\nRun Code Online (Sandbox Code Playgroud)\n\n当我尝试从上述命令编译和构建可执行文件时,出现错误
\n\nC代码的编译:
\n\ngcc -L/home/USRNAME/work/cython-codes/squaring/ -Wall -o test so_reader_in_c.c -lSquareNumber\nRun Code Online (Sandbox Code Playgroud)\n\n错误
\n\nso_reader_in_c.c: In function \xe2\x80\x98main\xe2\x80\x99:\nso_reader_in_c.c:11:4: warning: implicit declaration of function \xe2\x80\x98square_me\xe2\x80\x99 [- Wimplicit-function-declaration]\nresult=square_me(2);\n^\n/tmp/ccE5vIOH.o: In function `main\':\nso_reader_in_c.c:(.text+0x1a): undefined reference to `square_me\'\ncollect2: error: ld returned 1 exit status\nRun Code Online (Sandbox Code Playgroud)\n
小智 3
将 square_number.pyx 更改为:
cdef public int square_me(int x):
return x * x
Run Code Online (Sandbox Code Playgroud)
运行“setup.py”后,它将生成头文件“square_number.h”。将其包含在您的主应用程序中。见下文:
将您的“主要”功能更改为:
#include <Python.h>
#include "square_number.h"
int main()
{
Py_Initialize();
initsquare_number();
printf("%d",square_me( 4 ) );
Py_Finalize();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译时,请确保链接到 libpython.so 和 libsquare_number.so 您还需要通过向 gcc 提供 -I 标志来处理“Python.h”的包含目录搜索路径。
有关更多信息,请参阅:http://docs.cython.org/src/userguide/external_C_code.html