c++调用python

环境: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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值