您的位置:首页 > 编程语言 > C语言/C++

c++ 调用 python

2012-08-22 22:06 302 查看
Makefile first:


g++ t2.cpp -o t2 -I/usr/include/python2.7 -lpython2.7


t2.cpp code

#include <python2.7/Python.h>

#include <iostream>

#include <string>

void printDict(PyObject* obj)

{

if(!PyDict_Check(obj))

return ;

PyObject *k, *keys;

keys = PyDict_Keys(obj);

for(int i=0; i < PyList_GET_SIZE(keys); i++)

{

k = PyList_GET_ITEM(keys, i);

char *c_name = PyString_AsString(k);

printf("%s\n", c_name);

}

}

int main(void)

{

Py_Initialize();

if(!Py_IsInitialized())

return -1;

PyRun_SimpleString("import sys");

//where you put your py file

PyRun_SimpleString("sys.path.append('../')");

//Import

PyObject* pModule = PyImport_ImportModule("pc");//no *.py

if(!pModule)

{

printf("can't open python file!\n");

return -1;

}

//Dict module

PyObject* pDict = PyModule_GetDict(pModule);

if(!pDict)

{

printf("can't find dictionary.\n");

return -1;

}

printDict(pDict);

PyObject *pFunHi = PyDict_GetItemString(pDict, "sayHi");

PyObject_CallFunction(pFunHi, "s", "yourname");// @para1: obj, @para2: name

//release

Py_DECREF(pFunHi);

//Contruct a obj , call it's function

//Second Class

PyObject *pClassSecond = PyDict_GetItemString(pDict , "Second");

if(!pClassSecond)

{

printf("can't find second class.\n");

return -1;

}

//Person Class

PyObject *pClassPerson = PyDict_GetItemString(pDict, "Person");

if(!pClassPerson)

{

printf("can't find Person class.\n");

return -1;

}

//Construct Second Instance

PyObject* pInstanceSecond = PyInstance_New(pClassSecond, NULL, NULL);

if(!pInstanceSecond)

{

printf("can't create second instance.\n");

return -1;

}

//Construct Person Instance

PyObject *pInstancePerson = PyInstance_New(pClassPerson, NULL, NULL);

if(!pInstancePerson)

{

printf("can't create Person instance.\n");

return -1;

}

//pass Person Instance to Second Instance

PyObject_CallMethod(pInstanceSecond, "invoke", "O", pInstancePerson);

PyObject_CallMethod(pInstanceSecond, "method2", "O", pInstancePerson);

//call execute a py file

PyRun_SimpleString("exec(compile(open('./1.py').read(),'1.py', 'exec'),locals(), globals())");

//release

Py_DECREF(pInstanceSecond);

Py_DECREF(pInstancePerson);

Py_DECREF(pClassSecond);

Py_DECREF(pClassPerson);

Py_DECREF(pModule);

Py_Finalize();

return 0;

}

pc.py ( I put it at ..(upper) dir )

#!/usr/bin/python

class Person:

def sayHi(self):

print 'Hi'

class Second:

def invoke(self, obj):

obj.sayHi()

def method2(self, obj):

print "this is method2"

def sayHi(name):

print 'Hi ,', name

1.py ( I put it at .(this) dir )

#!/usr/bin/python

print " hello exec python"

output:

sayHi

__builtins__

__file__

__package__

Person

Second

__name__

__doc__

Hi , yourname

Hi

this is method2

hello exec python

from http://hi.baidu.com/zhouhanqing/blog/item/75b6134f2bddd91cb2de051a.html edited some of code

some extra info , try look at the following code test in python :

{'__builtins__': <module '>>> locals()

__builtin__' (built-in)>, '__name__': '__main__', '__doc__': None, '__package__': None}

>>> globals()

{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__doc__': None, '__package__': None}

>>> execfile("/home/dengwei/python_test/cpp/1.py")

hello exec python

>>> execfile("~/python_test/cpp/1.py")

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

IOError: [Errno 2] No such file or directory: '~/python_test/cpp/1.py'

Now we know

1.locals()
2.globals()
3.how to exec a python file (in python)
4.we knows exec a python file should specify it's absolute path
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: