代码之家  ›  专栏  ›  技术社区  ›  UncleZeiv

为什么PyRun_字符串不计算布尔文本?

  •  4
  • UncleZeiv  · 技术社区  · 17 年前

    我需要从C++中评估Python表达式。此代码似乎有效:

    PyObject * dict = PyDict_New();
    PyObject * val = PyRun_String(expression, Py_eval_input, dict, 0);
    Py_DECREF(dict);
    

    不幸的是,如果表达式为“False”的“True”(即val为0,PyErr_occurrent()返回True),那么它会失败得很厉害。我做错了什么?他们不应该分别评估Py_True和Py_False吗?

    1 回复  |  直到 17 年前
        1
  •  4
  •   joeforker    17 年前
    PyObject* PyRun_String(const char *str, int start, PyObject *globals, PyObject *locals);
    

    如果你想知道真假,他们必须在 *globals 迪克特传给口译员。你可以打电话来解决这个问题 PyEval_GetBuiltins .

    if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
        if (PyDict_SetItemString(globals, "__builtins__",
                     PyEval_GetBuiltins()) != 0)
            return NULL;
    }
    

    如果这不起作用,你可以试着 PyRun_String("import __builtin__ as __builtins__", globals, locals) 打电话之前 PyRun_String("True", ...) .

    您可能会注意到Python交互式解释器总是在 __main__ 我们在这里没有费心创建的模块。我不知道你是否需要一个 __主要__ 模块,除了有许多脚本包含 if __name__ == "__main__" .