简介
介绍一下Python虚拟机的初始化及退出,Python基本数据类型的对象创建以及C和Python之间的数据类型互相转换。
Python虚拟机的初始化及退出
初始化Python虚拟机需要调用Py_Initialize()来实现。
Py_IsInitialized()用于判断Python虚拟机初始化是否成功,True是成功,False是失败。
C/C++中调用Python之前必须先初始化虚拟机。
退出虚拟机的时候调用Py_Finalize()。
进程退出时要退出Python虚拟机。
实例:
#include
#include
using namespace std;
int main() {
// 初始化Python虚拟机
Py_Initialize();
// 判断Python虚拟机是否成功
if (Py_IsInitialized() == 0){
printf("fal to initialize Python\n");
return -1;
}
printf("server start\n");
// 退出Python虚拟机
Py_Finalize();
return 0;
}
编译方式及参数:
下面是Python2的编译方式,Python3的话,只需要将Python的库路径改成Python3的即可
g++ -I/usr/include/python2.7 -c main.cpp
g++ -o main main.o -L/usr/local/lib -lpython2.7 -lrt -lpthread -lutil -ldl
PyObject
Python的所有对象类型都是此类型的扩展。 这是一种类型,它包含Python将对象的指针视为对象所需的信息。 在正常的“发布”版本中,它仅包含对象的引用计数和指向相应类型对象的指针。 实际上没有任何东西被声明为PyObject,但是每个指向Python对象的指针都可以转换为PyObject *。 必须使用宏Py_REFCNT和Py_TYPE来访问成员。
宏描述,不包括全部
Py_TYPE: 获取Python对象的数据类型
Py_REFCNT: Python的引用计数器
Py_SIZE: 获取Python数据大小
还有很多...
Py_BuildValue
可以使用其将C的所有基本数据类型转换成Python可访问的数据类型。
标识符介绍:
s(str或None)[char *]
使用'utf-8'编码将以null结尾的C字符串转换为Python str对象。如果C字符串指针为NULL,则表示None。
s#(str或None)[char *,int]
使用'utf-8'编码将C字符串及其长度转换为Python str对象。如果C字符串指针为NULL,则忽略长度返回None。
y(字节)[char *]
这会将C字符串转换为Python字节对象。如果C字符串指针为NULL,则返回None。
y#(字节)[char *,int]
这会将C字符串及其长度转换为Python对象。如果C字符串指针为NULL,则返回None。
z(str或None)[