就是c语言调用python解释器去做事
- 需要python-dev(Ubuntu上的名字)的包,在centos为python-devel、python3-devel包(一般装了python的话,应该默认安装了这个包。如果没装就使用yum install python3-devel安装)
- 头文件所在目录/usr/include/python3.6m,库文件为libpython3.6m.so。在/usr/lib64下(但也不一定,不确定在哪的话可以全局搜索一下find / -name “libpython3.6m.*”)
python本身执行
- 其实python解释器本身执行也是调用libpython3.6m.so这种库去执行的,可以看到python可执行文件如:/usr/bin/python2.7其实是比较小的(只有几K),执行后,可以看到内存中有引入libpython3.6m.so这种库。
参考
使用示例
python_api_test.c
/*
* Compile with:
cc -I/usr/include/python3.6m -o python_api_test python_api_test.c -L/usr/lib64 -lpython3.6m
cc -I/usr/include/python3.6m -o python_api_test python_api_test.c -L/usr/lib64 -lpython3.6m -lrt -lpthread -lutil -ldl
*/
#include <stdio.h>
#include <Python.h>
int main() {
// 初始化Python虚拟机
Py_Initialize();
// 判断Python虚拟机是否成功
if (Py_IsInitialized() == 0){
printf("fal to initialize Python\n");
return -1;
}
printf("server start\n");
// 添加包搜索路径
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('./')");
PyObject * pModule = NULL;
PyObject * pFunc = NULL;
pModule = PyImport_ImportModule("main");
pFunc = PyObject_GetAttrString(pModule, "fun");
PyEval_CallObject(pFunc, NULL);//调用函数
// 退出Python虚拟机
Py_Finalize();
return 0;
}
main.py
print("111")
def fun():
print("func called")
return 1
终端打印数据
[root@VM-140-173-centos ~/workspace/c_test/python_api_test]# ./python_api_test
server start
111
func called