PyModule_GetDict没有将自定义函数和全局变量添加到生成的字典中(Python27)

时间:2018-01-11 20:56:03

标签: python c++ dictionary

我已经遵循了尝试在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;
}

0 个答案:

没有答案