• 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'
    • 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
  • 相关阅读:
    AJAX POST请求中参数以form data和request payload形式在servlet中的获取方式
    java如何得到GET和POST请求URL和参数列表
    Tomcat处理HTTP请求源码分析(下)
    Tomcat处理HTTP请求源码分析(上)(转)
    tomcat免重启随意更改java代码 提高开发效率
    ServletRequest中getReader()和getInputStream()只能调用一次的解决办法
    Spring MVC之@RequestParam @RequestBody @RequestHeader 等详解
    Tomcat处理HTTP请求源码分析(上)
    Drupal views中实现两列布局
    (转) 转换Drupal7模块到Drupal8
  • 原文地址:https://www.cnblogs.com/no7dw/p/2651543.html
Copyright © 2020-2023  润新知