【问题标题】:Why doesn't PyRun_String evaluate bool literals?为什么 PyRun_String 不评估布尔文字?
【发布时间】:2010-10-05 10:49:51
【问题描述】:

我需要从 C++ 计算 Python 表达式。此代码似乎有效:

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

不幸的是,如果表达式是“假”的“真”(即 val 为 0 并且 PyErr_Occurred() 返回真),它会严重失败。我究竟做错了什么?他们不应该分别评估为 Py_True 和 Py_False 吗?

【问题讨论】:

  • 在失败后调用 PyErr_Print() 会显示什么?
  • 我知道,我之前应该这样做,但由于多种原因,我无法在我的应用程序中调用 PyErr_Print()。无论如何,我在一个孤立的文件中复制了这个,这就是我得到的:NameError: name 'False' is not defined !!看起来这个文字在 C 中不可用...!
  • 既然回答了您的问题,您应该将其发布为答案。

标签: python boolean cpython


【解决方案1】:
PyObject* PyRun_String(const char *str, int start, PyObject *globals, PyObject *locals);

如果您想要 True 和 False,它们必须在传递给解释器的 *globals dict 中。你或许可以通过调用PyEval_GetBuiltins 来解决这个问题。

来自 Python 2.6 源代码:

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__ 模块中运行代码,我们没有费心在这里创建它。我不知道你是否需要一个__main__模块,除了有很多脚本包含if __name__ == "__main__"

【讨论】:

  • 哇,我从来没有意识到 True、False 甚至 None 是 builtin 模块的一部分......第一个解决方案为我做了,谢谢你指出我正确的方向!我在这里找到了更多信息:python.org/doc/2.3/whatsnew/section-bool.html
猜你喜欢
  • 1970-01-01
  • 2013-06-29
  • 2019-02-26
  • 1970-01-01
  • 1970-01-01
  • 2013-11-11
相关资源
最近更新 更多