从C++调用Python eval

3 投票
1 回答
2760 浏览
提问于 2025-04-17 13:25

我基本上是在尝试做和下面的问题一样的事情,但在调用 PyObject_Print 时遇到了运行时错误,提示“toupper() 在 0x776e0226 出现错误”。

Python C API: 使用 PyEval_EvalCode

我的代码是:

int callExecFunction(const char* evalStr)
{
    PyCodeObject* code = (PyCodeObject*)Py_CompileString(evalStr, "pyscript", Py_eval_input);
    PyObject* global_dict = PyModule_GetDict(pModule);
    PyObject* local_dict = PyDict_New();
    PyObject* obj = PyEval_EvalCode(code, global_dict, local_dict);

    PyObject* result = PyObject_Str(obj);
    PyObject_Print(result, stdout, 0);
}

evalStr 是 "setCurrentFileDir()",而 pModule 是之前从一个脚本初始化的,没有错误,并且这个代码可以正常工作:http://docs.python.org/2/extending/embedding.html#pure-embedding

在加载的模块里面有这个函数:

def setCurrentFileDir():
    print "setCurrentFileDir"
    return "5"

我在调用 eval 函数时错过了什么或者做错了什么。请注意,我不能通过 Python API “直接”调用 setCurrentFileDir 函数,我必须使用 eval。

1 个回答

0

其实这个问题解决得很好。不过我发现目录里有一个.pyd文件,这是Python在之前运行脚本时生成的(而且Eclipse把它隐藏了),那个时候脚本里没有定义相关的函数,所以才导致了问题。

正是从这里我想到问题可能和这个.pyd文件有关。

python NameError: name '<anything>' is not defined (but it is!)

撰写回答