我需要你的帮助!
如何根据以下.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。谢谢你的帮助!
答案 0 :(得分:0)
找到适合我的解决方案! :)
另一种方法可能是将DefineEasyCalls.py放入模块目录加载路径,而不是在Testfile.py中导入此文件,但这对我没有用。在这里,我找不到c api搜索python模块的路径(例如numpy)。也许有人知道如何以这种方式让思考工作?