嵌入Python 3.3:如何访问_PyParser_Grammar?

时间:2013-06-28 15:35:52

标签: c++ python-3.3 python-c-api python-embedding

我试图模仿Python / C API的PyRun_InteractiveLoop()函数,但是来自我的雇主使用的不同输入系统。 Python FAQ(http://docs.python.org/3/faq/extending.html#how-do-i-tell-incomplete-input-from-invalid-input)具有以下代码,用于检查给定的字符数组是否是完整的Python块:

#include <Python.h>
#include <node.h>
#include <errcode.h>
#include <grammar.h>
#include <parsetok.h>
#include <compile.h>

int testcomplete(char *code)
  /* code should end in \n */
  /* return -1 for error, 0 for incomplete, 1 for complete */
{
  node *n;
  perrdetail e;

  n = PyParser_ParseString(code, &_PyParser_Grammar,
                           Py_file_input, &e);
  if (n == NULL) {
    if (e.error == E_EOF)
      return 0;
    return -1;
  }

  PyNode_Free(n);
  return 1;
}

这为_PyParser_Grammar提供了未声明的变量错误。在搜索Python源代码时,我没有找到任何声明_PyParser_Grammar的头文件。进一步看,我发现它由一些函数引用,特别是metagrammar.c中定义的meta_grammar()和Py_meta_grammar()。

虽然meta_grammar()是在pgen.h中定义的,但是尽管使用-lpython3.3m编译(我的测试代码为g ++),它仍会给出一个未定义的符号错误。快速nm显示meta_grammar()不是libpython3.3m.so中的可见符号,而Py_meta_grammar()是。但是,在搜索Python源代码时,我没有找到任何声明Py_meta_grammar()的头文件。

我错过了什么吗?声明/定义了这些符号在哪里?

1 个答案:

答案 0 :(得分:2)

经过大量的讨论后,似乎没有标题声明_PyParser_Grammar。但是,声明

extern grammar _PyParser_Grammar;

在每个需要访问的C ++源文件中都能正常工作。不是特别优雅,但至少它会编译。