如何从C ++正确调用python函数

时间:2019-05-25 22:45:21

标签: python c++ embedding

我正在尝试从C ++ 使用矩阵调用python脚本,以便获取Python函数绘制的矩阵。

主要问题是矩阵向python函数的传输。我几乎找不到例子,其中将嵌入函数作为值给出了整个矩阵。

我没有使用任何嵌入的经验,也没有使用python的经验,但是我一直对如何正确地执行它感兴趣,因此,如果发现任何编码错误,请随时纠正。

用于嵌入的代码是此处精简的代码示例形式:https://docs.python.org/release/2.6.5/extending/embedding.html#extending-embedded-python

尽管我不确定是否应该为python脚本创建标题和模块,还是足够了。

MatCal.cpp:

#include <Python.h>
#include <iostream>
#include <stdlib.h>
using namespace std;

/*argv[1] = MatCal.py
  argv[2] = plot*/ 


int main(int argc, char *argv[]) {
    float a[100][100];
    pyPlot(a[][], argc, *argv[])
    return 0;
}



void pyPlot(float a[][]) {
    PyObject *pName, *pModule, *pFunc;
    PyObject *pArgs,
    int i;

    if (argc < 3) {
        fprintf(stderr,"Usage: call pythonfile funcname [args]\n");
        return 1;
    }

    Py_Initialize();
    pName = PyString_FromString(argv[1]);

    pModule = PyImport_Import(pName);
    Py_DECREF(pName);

    if (pModule != NULL) {
        pFunc = PyObject_GetAttrString(pModule, argv[2]);

        if (!pFunc || !PyCallable_Check(pFunc)) {
            PyErr_Print();
            fprintf(stderr, "Failed to load funtion from module");
            }

            PyObject_CallObject(pFunc, pArgs);
            Py_DECREF(pArgs);
        }

        Py_XDECREF(pFunc);
        Py_DECREF(pModule);

    else {
        PyErr_Print();
        fprintf(stderr, "Failed to load \"%s\"\n", argv[1]);
        return 1;
    }
    Py_Finalize();
    return 0;
}

MatCal.py:

import matplotlib as mpl
import numpy as np
import astropy as ap

def plot(a, len, wid)
    a=ap.simple_sqrt(a)
    plt.imshow(a, cmap='hsv')
    return None

(建议我使用simple_sqrt来减小矩阵中值之间的距离并改善其可视化效果。)

我仍然不确定嵌入的内容,我们非常感谢您的帮助。另外:如果有人知道关于API,嵌入和或跨语言编程的好书/文章,那么我对该主题非常感兴趣。

0 个答案:

没有答案