C++ 嵌入Python 3.3:如何访问语法?

C++ 嵌入Python 3.3:如何访问语法?,c++,python-3.3,python-c-api,python-embedding,C++,Python 3.3,Python C Api,Python Embedding,我试图模拟Python/CAPI的PyRun_InteractiveLoop()函数,但来自我的雇主使用的不同输入系统。Python FAQ()包含以下代码,用于检查给定字符数组是否是完整的Python块: #include <Python.h> #include <node.h> #include <errcode.h> #include <grammar.h> #include <parsetok.h> #include <c

我试图模拟Python/CAPI的PyRun_InteractiveLoop()函数,但来自我的雇主使用的不同输入系统。Python FAQ()包含以下代码,用于检查给定字符数组是否是完整的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;
}
#包括
#包括
#包括
#包括
#包括
#包括
int testcomplete(字符*代码)
/*代码应以结尾\n*/
/*返回-1表示错误,0表示不完整,1表示完整*/
{
节点*n;
佩雷;
n=PyParser\u ParseString(代码和PyParser\u语法,
Py_文件输入(&e);
如果(n==NULL){
如果(e.error==e_EOF)
返回0;
返回-1;
}
PyNode_-Free(n);
返回1;
}
这为_PyParser_语法提供了一个未声明的变量错误。搜索Python源代码时,我没有找到任何声明_PyParser_语法的头。进一步看,我发现它被一些函数引用,特别是metagrammar()和Py_meta_grammar(),正如metagrammar.c中定义的那样

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


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

经过大量的伪造,似乎没有声明语法的头。但是,

extern grammar _PyParser_Grammar;
在需要访问的C++源文件中,P>完全工作。不是特别优雅,但至少它可以编译。

如果你在Win上(Python不是静态链接的-这是默认的,我不知道是否可能),声明应该是:
extern\u declspec(dllimport)grammar\u PyParser\u grammar