python的開發(fā)效率之高是毋庸置疑的竭恬,C++/C的語言性能之快也是讓人羨慕的褥赊。這一次糕档,魚和熊掌是可以兼得的 :),混合編程拌喉,使得我們可以取之所長速那,游走在C與python之間。很多游戲開發(fā)中使用python來實現(xiàn)戰(zhàn)斗腳本尿背。
下面是script.py的內(nèi)容
#!/usr/bin/python
# Filename: script.py
class Student:
def SetName(self,name):
self._name = name
def PrintName(self):
print self._name
def hello():
print "Hello World\n"
def world(name):
print "name"
C++調(diào)用Script.py
#include <python2.7/Python.h>
#include <iostream>
#include <string>
int main () {
//使用python之前端仰,要調(diào)用Py_Initialize();這個函數(shù)進(jìn)行初始化
Py_Initialize();
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('./')");
PyObject * pModule = NULL;
PyObject * pFunc = NULL;
PyObject * pClass = NULL;
PyObject * pInstance = NULL;
//這里是要調(diào)用的文件名
pModule = PyImport_ImportModule("script");
//這里是要調(diào)用的函數(shù)名
pFunc= PyObject_GetAttrString(pModule, "hello");
//調(diào)用函數(shù)
PyEval_CallObject(pFunc, NULL);
Py_DECREF(pFunc);
pFunc = PyObject_GetAttrString(pModule, "world");
PyObject_CallFunction(pFunc, "s", "zhengji");
Py_DECREF(pFunc);
//測試調(diào)用python的類
pClass = PyObject_GetAttrString(pModule, "Student");
if (!pClass) {
printf("Can't find Student class.\n");
return -1;
}
pInstance = PyInstance_New(pClass, NULL, NULL);
if (!pInstance) {
printf("Can't create Student instance.\n");
return -1;
}
PyObject_CallMethod(pInstance, "SetName", "s","my family");
PyObject_CallMethod(pInstance, "PrintName",NULL,NULL);
//調(diào)用Py_Finalize,這個根Py_Initialize相對應(yīng)的田藐。
Py_Finalize();
return 0;
}
編譯C++代碼
g++ zj.cpp -o zj -lpython2.7
輸出結(jié)果
zj@hp:~/tmp/CcalPy$ ./zj
Hello World
name
my family