博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++ 调用 python
阅读量:6453 次
发布时间:2019-06-23

本文共 3467 字,大约阅读时间需要 11 分钟。

 

  • 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 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

转载地址:http://dvyzo.baihongyu.com/

你可能感兴趣的文章
开篇,博客的申请理由
查看>>
点滴积累【C#】---C#实现上传word以流形式保存到数据库和读取数据库中的word文件。...
查看>>
Ubuntu常用笔记
查看>>
Token和session 详解
查看>>
JMeter IP欺骗压测
查看>>
Serializers 序列化组件
查看>>
最简单的RPC框架实现
查看>>
Servlet 技术全总结 (已完成,不定期增加内容)
查看>>
[JSOI2008]星球大战starwar BZOJ1015
查看>>
CountDownLatch与thread-join()的区别
查看>>
linux下MySQL安装登录及操作
查看>>
centos 7 部署LDAP服务
查看>>
揭秘马云帝国内幕:马云的野心有多大
查看>>
topcoder srm 680 div1
查看>>
算法专题(1)-信息学基本解题流程!
查看>>
模拟文件系统
查看>>
iOS项目分层
查看>>
UML关系图
查看>>
一个action读取另一个action里的session
查看>>
leetcode 175. Combine Two Tables
查看>>