您的位置:首页 > 运维架构 > Linux

linux 下C++调用python返回值(python.so)

2016-09-02 11:44 447 查看
最近项目需要,在linux系统中使用c++ 调用 python,然后需要解析python的返回值(元组),网上一搜例子一大堆,工程中调用ptyhon头文件和库文件,但是linux系统一般自带了python,本人使用的centos7中自带的python版本号为2.7.5,但并没有python.so 文件,因此从python官网上选择下载python2.7.5重新编译一下,生成so文件。

下载地址:https://www.python.org/downloads/source/

./configure --prefix=/usr/local/ --enable-shared CFLAGS=-fPIC  

make  

make install

linux 测试程序

#include <iostream>

using namespace std;

#include <stdio.h>

#include <stdlib.h>

#include <Python.h>

int main()

{

    PyObject *pName, *pModule, *pDict, *pFunc, *pArgs, *pRetVal;

    Py_Initialize();

    if (!Py_IsInitialized())

        return -1;

    //load py script filename

    PyRun_SimpleString("import sys");

    PyRun_SimpleString("sys.path.append('./')");

    pName = PyString_FromString("py_test");// py_test.py

    pModule = PyImport_Import(pName);

    if (!pModule){

        printf("cant find py_test.py");

        getchar();

        return -1;

    }

    pDict = PyModule_GetDict(pModule);

    if (!pDict) return -1;

    //find function name

    pFunc = PyDict_GetItemString(pDict, "get_str");

    if (!pFunc || !PyCallable_Check(pFunc)){

        printf("cant find function [add]");

        getchar();

        return -1;

    }

    //push args to stack

    pArgs = PyTuple_New(2);

    PyTuple_SetItem(pArgs, 0, Py_BuildValue("s", "Hello, "));

    PyTuple_SetItem(pArgs, 1, Py_BuildValue("s", "C_Python"));

    //call python function

    pRetVal = PyObject_CallObject(pFunc, pArgs);

    if (pRetVal == NULL){

        printf("CalllObject return NULL");

        return -1;

    }

    char* ret_str;

    int w = 0 , h = 0;

    //解析元组

    PyArg_ParseTuple(pRetVal, "s,i,i",&ret_str, &w, &h);

    printf("%s, %d, %d\n", ret_str, w, h);

    //解析字符串

    //printf("function return value:%s\r\n", PyString_AsString(pRetVal));

    Py_DECREF(pName);

    Py_DECREF(pArgs);

    Py_DECREF(pModule);

    Py_DECREF(pRetVal);

    //close python

    Py_Finalize();

    getchar();

    return 0;

}

python 测试程序

#coding:utf-8

def get_int( ):

    a = 10

    b = 20

    return a + b

def get_str( s1, s2 ):

    #return s1 + s2

    #return 'Hello , TY'

    return ('Hello, World', 10, 20)

取名叫 py_test.py 放到工程目录下

记得工程中加入 python 库

测试结果

Hello, World, 0, 0
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ centos python linux