如何调用c ++中另一个文件中定义的python函数?

时间:2017-04-09 18:44:55

标签: python c++ api

我需要你的帮助!

如何根据以下.py源调用c ++中的python函数:

DefineEasyCalls.py

def myfun():
    return 100 

Testfile.py

from DefineEasyCalls import *
fun = myfun()

我想在我的c ++程序中使用Testfile.py作为Inputfile。在那里,我想打电话给myfun()并用它做点什么。你有想法如何实现这一目标吗?也许我用c ++导入这两个文件并检查Testfile.py中是否是一个名为myfun的方法,而不是从testfile.py文件调用相应的函数,但是如果testfile.py中有myfun的函数输入怎么办?在这种情况下,这种策略对我不起作用。

如果我在Testfile.py中直接定义myfun(Testfile.py = DefineEasyCalls.py中的代码),那么事情就好了。但我想使用Testfile.py作为输入文件而不是DefineEasyCalls.py!此外,我还想在Testfile.py中给myfun一些输入参数,我也想稍后在c ++中使用它。有人知道如何做到这一点吗?

这是我的c ++代码:

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

int callmyfun();

int main()
{
    int a = callmyfun();
    int b = 1;
    cout << a+b << endl; 
    cin.get();
    return 0;
}


int callmyfun()
{
PyObject *pName, *pModule, *pDict, *pFunc;
PyObject *pValue;

Py_Initialize();

PyObject* sysPath = PySys_GetObject("path");
PyList_Append(sysPath, PyBytes_FromString("C:/ .. path .../x64/Release"));

// Load the module
pName = PyUnicode_DecodeFSDefault("Testfile");
pModule = PyImport_Import(pName);
Py_DECREF(pName);

cout << pName << endl;

if (pModule != NULL)
{
    cout << "module found\n";
    pDict = PyModule_GetDict(pModule);
    pFunc = PyObject_GetAttrString(pModule, "myfun");

    if (pFunc != NULL) {
        pValue = PyObject_CallObject(pFunc, NULL);
        printf("Result of call: %ld\n", PyLong_AsLong(pValue));
        Py_DECREF(pValue);
        long long L = PyLong_AsLongLong(pValue);
        return L;
    }
    else {
        std::cout << "Couldn't find func\n";
        return 0;
    }
}
else
{
    cout << "module not found!\n";
    return 0;
}

     Py_Finalize();
}

我使用MSVC2015和python 3.6。谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

找到适合我的解决方案! :)

  • 创建一个包含所需功能的c ++类
  • 创建一个python扩展模块(我使用了swig)
  • 通过Testfile.py
  • 中的python扩展模块调用该函数

另一种方法可能是将DefineEasyCalls.py放入模块目录加载路径,而不是在Testfile.py中导入此文件,但这对我没有用。在这里,我找不到c api搜索python模块的路径(例如numpy)。也许有人知道如何以这种方式让思考工作?