xiguaqq20 发表于 2015-4-26 05:24:24

c++ 调用 python

  

[*]Makefile first:g++ t2.cpp -o t2 -I/usr/include/python2.7 -lpython2.7   
[*]t2.cpp code

#include
#include
#include

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__': , '__name__': '__main__', '__doc__': None, '__package__': None}
>>> globals()
{'__builtins__': , '__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 "", line 1, in
IOError: 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
  
页: [1]
查看完整版本: c++ 调用 python