c++与Python3互相调用
2013-06-19 11:02
447 查看
由于最近想看看动态语言,所以就看了下python的使用方法,但是有时候动态语言的执行效率是个问题,于是就想,如何利用静态语言和动态语言进行结合,由于本人比较水,只会写一些c++,所以就决定用c++和python进行互调,但是网上都是python2和c++的调用,没有python3的互相调用的例子,windows下就更少了,于是我自己摸索了一晚上,终于把python和c++互调研究通了。
有好东西当然和大家分享一下了:
同样附上python代码:
当然我也是从网上,c++和python2互相调用的文章中拿过来的,纠结本人的地方我已经用红字标出来了,欢迎大家拍砖!
有好东西当然和大家分享一下了:
#include <Python.h> #include <string> #include <codecvt> int main(int argc, char** argv) { // 初始化Python //在使用Python系统前,必须使用Py_Initialize对其 //进行初始化。它会载入Python的内建模块并添加系统路 //径到模块搜索路径中。这个函数没有返回值,检查系统 //是否初始化成功需要使用Py_IsInitialized。 Py_Initialize(); // 检查初始化是否成功 if ( !Py_IsInitialized() ) { return -1; } // 添加当前路径 //把输入的字符串作为Python代码直接运行,返回0 //表示成功,-1表示有错。大多时候错误都是因为字符串 //中有语法错误。 PyRun_SimpleString("print(4+5)"); PyRun_SimpleString("import sys"); PyRun_SimpleString("sys.path.append('G:/pythonProject')"); PyObject *pName,*pModule,*pDict,*pFunc,*pArgs,*pValue; std::wstring str = L"pytest"; std::wstring_convert<std::codecvt_utf8<wchar_t>> conv; std::string sr= conv.to_bytes(str); // 载入名为pytest的脚本 pName = PyUnicode_FromUnicode(str.c_str(),str.size()); //pName = PyString_FromString("pytest"); pModule = PyImport_ImportModule(sr.c_str()); //pModule = PyImport_Import(pName); if (!pModule) { printf("can't find pytest.py"); getchar(); return -1; } pDict = PyModule_GetDict(pModule); if ( !pDict ) { return -1; } // 找出函数名为add的函数 pFunc = PyDict_GetItemString(pDict, "add"); if ( !pFunc || !PyCallable_Check(pFunc) ) { printf("can't find function [add]"); getchar(); return -1; } // 参数进栈 pArgs = PyTuple_New(2); // PyObject* Py_BuildValue(char *format, ...) // 把C++的变量转换成一个Python对象。当需要从 // C++传递变量到Python时,就会使用这个函数。此函数 // 有点类似C的printf,但格式不同。常用的格式有 // s 表示字符串, // i 表示整型变量, // f 表示浮点数, // O 表示一个Python对象。 PyTuple_SetItem(pArgs, 0, Py_BuildValue("l",3)); PyTuple_SetItem(pArgs, 1, Py_BuildValue("l",4)); // 调用Python函数 PyObject_CallObject(pFunc, pArgs); //下面这段是查找函数foo 并执行foo pFunc = PyDict_GetItemString(pDict, "foo"); if ( !pFunc || !PyCallable_Check(pFunc) ) { printf("can't find function [foo]"); getchar(); return -1; } pArgs = PyTuple_New(1); PyTuple_SetItem(pArgs, 0, Py_BuildValue("l",2)); // PyObject_CallObject(pFunc, pArgs); Py_DECREF(pName); Py_DECREF(pArgs); Py_DECREF(pModule); // 关闭Python Py_Finalize(); system("pause"); return 0; }
同样附上python代码:
def add(a,b): print ("in python function add") print ("a = " + str(a)) print ("b = " + str(b)) print ("ret = " + str(a+b)) return def foo(a): print ("in python function foo") print ("a = " + str(a)) print ("ret = " + str(a * a)) return
当然我也是从网上,c++和python2互相调用的文章中拿过来的,纠结本人的地方我已经用红字标出来了,欢迎大家拍砖!
相关文章推荐
- python和C/C++的互相调用 VC
- python与C/C++互相调用
- C++ 应用程序中 嵌入的python脚本与C++程序的互相调用(访问 通信)
- Python调用C/C++互相调用
- C/C++与Python互相调用
- Boost.Python C++与Python的互相调用之Python调用c/c++函数
- Python调用C++底层库,互相传值问题
- C/C++与python互相调用
- 详解python如何调用C/C++底层库与互相传值
- python和C/C++的互相调用 VC
- 详解python如何调用C/C++底层库与互相传值
- 初始化函数中的虚函数调用( C++ vs python )
- linux下使用swig让python调用C++(复杂版:包括多文件调用和链接库)
- 分享: Python调用C/C++的种种方法
- python中调用C++写的动态库
- python 调用c++ ffmpeg接收rgb
- C++多线程中调用python api函数
- (转载)lua和c/c++互相调用实例分析
- C++调用Python,Python访问C++中的数据
- Linux下C++调用python,gcc和eclipse的编译方法