zoukankan      html  css  js  c++  java
  • c++ 调用 python

    c++ 调用 python - 邓维 - 博客园

    c++ 调用 python

    • 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'
      复制代码
      • 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
    • Now we know

  • 相关阅读:
    Gym101630A Archery Tournament
    BZOJ2588 Count on a tree
    Redis主从复制
    Redis事务
    Redis持久化RDB和AOF
    设计模式之代理模式
    Spring AOP(面向切面编程)
    基于TCP和UDP的Socket通信
    Ajax无法访问回调函数seccess问题
    SpringBoot Ajax跨域问题(session共享问题)
  • 原文地址:https://www.cnblogs.com/lexus/p/2870692.html
Copyright © 2011-2022 走看看