zoukankan      html  css  js  c++  java
  • c++调用python脚本

    直接上代码
    
    #include <iostream>
    #ifdef WIN32
    #include "Python.h"
    #else
    #include "/usr/local/include/python2.7/Python.h"
    #endif
    //如果是在windows-mingw-python2.7环境下,需要在工程->设置->Include和lib设置python2.7的路径,
    //并在“链接 ”的参数中添加-Lc:\Python27\libs -lpython27
    
    //如果是在linux环境下,则用下面命令进行编译链接 
    //g++ PythonTest.cpp -I/usr/local/include/python2.7 -L/usr/local/lib/python2.7 -lpython2.7 -lpthread -ldl -lm -lutil -o test
    
    using namespace std;
    
    int main(int argc, char** argv)
    {
    //python初始化 
        Py_Initialize();
        if(!Py_IsInitialized())
        {
            printf("Py_Initialize() Error!\n");
            return -1;
        }
    //只有在linux下才需要指定路径
    #ifndef WIN32
        PyRun_SimpleString("import sys");
        PyRun_SimpleString("sys.path.append('./')");
    #endif
        PyObject *pName, *pModule, *pDict, *pFunc, *pArgs;
    //载入module 
        pName = PyString_FromString("pytest");
        pModule = PyImport_Import(pName);
    
        if(!pModule)
        {
            printf("Can't find pytest.py");
            getchar();
            return -1;
        }
      //将module中的方法以字典形式读入
        pDict = PyModule_GetDict(pModule);
        if(!pDict)
        {
            printf("PyModule_GetDict Error!\n");
            return -1;
        }
    //在方法字典中通过名字获取对应的方法
        pFunc = PyDict_GetItemString(pDict, "add");
        if(!pFunc || !PyCallable_Check(pFunc))
        {
            printf("Can't find function[add]\n");
            getchar();
            return -1;
        }
    
    //设置方法的参数 
        *pArgs;
        pArgs = PyTuple_New(2);
        PyTuple_SetItem(pArgs, 0, Py_BuildValue("f", 3.1));
        PyTuple_SetItem(pArgs, 1, Py_BuildValue("f", 4.3));
    //调用方法add,传入参数 float
        PyObject_CallObject(pFunc, pArgs);
    
    //调用方法foo,传入参数int 
        pFunc = PyDict_GetItemString(pDict, "foo");
        if(!pFunc || !PyCallable_Check(pFunc))
        {
            printf("Can't find function [foo]\n");
            getchar();
            return -1;
        }
    
        pArgs = PyTuple_New(1);
        PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", 3));
    
        PyObject_CallObject(pFunc, pArgs);
        
    //调用方法hello,传入参数string
        pFunc = PyDict_GetItemString(pDict, "hello");
        if(!pFunc || !PyCallable_Check(pFunc))
        {
            printf("Can't find function [hello]\n");
            getchar();
            return -1;
        }
        pArgs = PyTuple_New(1); 
        PyTuple_SetItem(pArgs, 0, Py_BuildValue("s", "World"));
        
        PyObject_CallObject(pFunc, pArgs);
        
    
    //释放之前的变量 
        Py_DECREF(pName);
        Py_DECREF(pArgs);
        Py_DECREF(pModule);
    //python调用结束 
        Py_Finalize();
        return 0;
    }


    Makefile文件
    PYTHON_INCLUDE_FLAGS = \
            -I/usr/local/include/python2.7
    
    LIB_FLAGS = \
            -L/usr/local/lib/python2.7 -lpython2.7 -lpthread -ldl -lm -lutil
    SOURCE = \
            PythonTest.cpp
    all:${SOURCE}
            g++ $(PYTHON_INCLUDE_FLAGS) $(SOURCE) ${LIB_FLAGS} -o test
    clean:
            rm -f test *.o *.out
    
    
    
     
  • 相关阅读:
    VMware虚拟机的三种连接方式
    Codeblocks16.01配置wxWidgets3.0.4
    DAO编程(VC6.0中的应用)
    VC++ 中用ado连接数据库
    C中文件的输入输出与C++的文件流
    Cpp中流继承关系
    a标签置灰不可点击
    手动操作数据库
    $.ajaxFileUpload is not a function
    【工具】手机号码、电话号码正则表达式
  • 原文地址:https://www.cnblogs.com/geekma/p/2577005.html
Copyright © 2011-2022 走看看