我已经遵循了尝试在c ++中加载python模块的所有基本步骤,但是当我尝试获取脚本中的项目字典时,它似乎忽略了我想要使用的函数和全局变量内。当我遍历这些项目时,我得到的只是脚本的内置,文件,包,路径,名称和doc属性,而不是其他内容。我检查__name__
并且它正确显示(“test.py”是我的py文件的名称,它返回“test”就好了)。当我实际尝试加载我的函数或全局变量(test,qa)时,PyDict_GetItemString函数返回NULL。我做错了什么,在教程中这很好用,但在我的测试应用程序中,它不起作用?
这是我的Py脚本,也许我忘了做一些可以让我的项目被看到的东西?
qa = "hello test"
def test(a):
q = "hello world, I am " + a
#print q
return q
这里也是我的C ++代码,也许我忘了这里的东西?
#include <iostream>
#include <Python.h>
int main() {
Py_Initialize();
PyObject
*pName,
*pModule,
*pDict,
*pFunc,
*pArgs,
*pValue;
// get filename as a pystring
pName = PyString_FromString("test");
std::cout << std::endl << pName;
// Import module from filename
pModule = PyImport_Import(pName);
std::cout << std::endl << pModule;
// build the module's dict
pDict = PyModule_GetDict(pModule);
std::cout << std::endl << pDict << " " << PyDict_Size(pDict);
PyObject* keys = PyDict_Keys(pDict);
int s = PyList_Size(keys);
for (int i = 0; i < s; ++i) {
PyObject* item = PyList_GetItem(keys, i);
printf("\n");
printf(PyString_AsString(item));
}
PyObject* testvar = PyDict_GetItemString(pDict, "qa");
printf(PyString_AsString(testvar));
// get a function from the dict
pFunc = PyDict_GetItemString(pDict, "test");
std::cout << std::endl << pFunc;
// build the arg tuple
pArgs = PyTuple_New(1);
// create an argument
pValue = PyString_FromString("cee programme");
// set an argument
PyTuple_SetItem(pArgs, 0, pValue);
// call the function with the func and the args
PyObject* pResult = PyObject_CallObject(pFunc, pArgs);
// error checking
if (pResult == NULL) {
printf("\nis broek");
}
char* res = PyString_AsString(pResult);
// "destroy the interpreter"
Py_Finalize();
printf(res);
return 0;
}