【问题标题】:Embedding Python 3.3: How do I access _PyParser_Grammar?嵌入 Python 3.3:如何访问 _PyParser_Grammar?
【发布时间】:2013-06-28 15:35:51
【问题描述】:

我正在尝试模拟 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() 的头文件。

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

【问题讨论】:

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


    【解决方案1】:

    经过一番折腾,似乎没有标头声明 _PyParser_Grammar。但是,声明

    extern grammar _PyParser_Grammar;
    

    在每个需要访问的 C++ 源文件中都能完美运行。不是特别优雅,但至少可以编译。

    【讨论】:

    • 如果您在 Win 上(并且 Python 不是 静态链接 - 这是默认设置,我不知道是否有可能),声明应该是:extern __declspec(dllimport) grammar _PyParser_Grammar;.
    猜你喜欢
    • 1970-01-01
    • 2013-09-29
    • 2014-09-08
    • 1970-01-01
    • 1970-01-01
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多