【问题标题】:Calling python eval from c++从 C++ 调用 python eval
【发布时间】:2013-01-23 15:57:30
【问题描述】:

我基本上是在尝试与以下问题相同,但我在调用 PyObject_Print 时遇到运行时错误,抱怨“toupper() at 0x776e0226”中的错误

Python C API: Using 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。

【问题讨论】:

  • 您的callExecFunction 实现适用于我的Python 2.7 和g++ 4.6.3,没有任何错误。您能否发布一个可以编译和运行的完整示例?另外,请发布您用于编译的命令行。例如,这是我编译 C++ 代码的方式:g++ -I /usr/include/python2.7 -o eval_test eval_test.cpp -lpython2.7

标签: c++ python embedding


【解决方案1】:

实际上这很好用。但是,我在 python 必须构建的目录中有一个 .pyd 文件(并且 eclipse 对我隐藏)来自未定义函数的较旧运行的 python 脚本,导致问题。

这是我想到问题可能是 .pyd 文件的地方。

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

【讨论】:

    猜你喜欢
    • 2013-08-22
    • 1970-01-01
    • 2016-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-07
    • 2011-11-14
    • 2023-04-03
    相关资源
    最近更新 更多