c++调用python
来源:互联网 发布:基础c语言代码实例 编辑:程序博客网 时间:2024/06/10 09:14
环境:vs2017+python3.6 32位
1.vs建立空项目
2.将Debug改为Release;x86不变
3.项目-》属性-》c/c++-》常规-》附加包含目录-》填入python路径中的include路径
项目-》属性-》链接器-》常规-》附加库目录-》填入python路径中的libs路径
4.vs建立文件pytest.py填入下面代码
#pytest.py#test function 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 class guestlist: def __init__(self): print ("aaaa" ) def p(): print ("bbbbb" ) def __getitem__(self, id): return ("ccccc" )def update(): guest = guestlist() print (guest['aa'] )#update()
建立main.cpp填入下面代码
#include <Python.h> #include <iostream> using namespace std;int main(){ // 初始化Python //在使用Python系统前,必须使用Py_Initialize对其 //进行初始化。它会载入Python的内建模块并添加系统路 //径到模块搜索路径中。这个函数没有返回值,检查系统 //是否初始化成功需要使用Py_IsInitialized。 Py_Initialize(); // 检查初始化是否成功 if (!Py_IsInitialized()) { return -1; } // 添加当前路径 //把输入的字符串作为Python代码直接运行,返回0 //表示成功,-1表示有错。大多时候错误都是因为字符串 //中有语法错误。 PyRun_SimpleString("import sys"); PyRun_SimpleString("import os"); PyRun_SimpleString("print ('---import sys---')"); PyRun_SimpleString("sys.path.append('./')"); PyObject *pModule, *pDict, *pFunc, *pArgs; // 载入名为pytest的脚本 const char *a ="pytest"; pModule = PyImport_ImportModule(a); if (!pModule) { printf("can't find pytest.py"); getchar(); return -1; } pDict = PyModule_GetDict(pModule); if (!pDict) { return -1; } // 找出函数名为add的函数 printf("----------------------\n"); 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 printf("----------------------\n"); 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); printf("----------------------\n"); pFunc = PyDict_GetItemString(pDict, "update"); if (!pFunc || !PyCallable_Check(pFunc)) { printf("can't find function [update]"); getchar(); return -1; } pArgs = PyTuple_New(0); PyTuple_SetItem(pArgs, 0, Py_BuildValue("")); PyObject_CallObject(pFunc, pArgs); Py_DECREF(pArgs); Py_DECREF(pModule); // 关闭Python Py_Finalize(); getchar(); return 0;}
报错:网上很多的代码像“代码1”可能会出现使用PyImport_Import导入自定义函数失败,pModule 返回值始终为0,原因是不确定,解决方法是替换为代码2使用PyImport_ImportModule
。
代码1:
pName = PyString_FromString("pytest");pModule = PyImport_Import(pName);
代码2:
const char * filename = "pytest"; pModule = PyImport_ImportModule(filename);
问题:PyObject_CallObject报错
解决1:debug改为release
0 0
- BCB(C++)调用Python
- C中调用PYTHON
- C调用python
- C调用python
- Python 调用 C函数
- python调用c
- Python 调用C
- c中调用python
- Python调用c/c++
- c 调用python
- python 调用 c 函数
- python调用C函数库
- Python调用C
- Python调用C/C++
- Python调用C程序
- python调用c/c++
- python调用c
- c调用python
- 实验三 基于DCT编码的JPEG压缩
- BTree,B-Tree,B+Tree,B*Tree都是什么
- C++11 threads, locks and condition variables
- 关于抽象类的使用方法
- 欢迎使用CSDN-markdown编辑器
- c++调用python
- log4j
- 对于概率论数字特征的理解
- 南宁市二手房铁路公积金贷款流程(二)
- 网络流-最小费用最大流
- 软件流程--开发流程规范
- 比例尺与分辨率
- not marked as ignorable JDBC like%?% Tomcat 启动一闪而过
- centos7下jetty临时目录被tmpwatch删除导致资源文件(css/js)无法加载的问题