Встраивание Python 3.3: как получить доступ к _PyParser_Grammar?

Я пытаюсь эмулировать функцию PyRun_InteractiveLoop() API Python / C, но из другой системы ввода, используемой моим работодателем. Часто задаваемые вопросы по Python ( http://docs.python.org/3/faq/extending.html) содержат следующий код, используемый для проверки того, данный массив символов является полным блоком 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. Заглядывая дальше, я обнаружил, что на него ссылаются несколько функций, в частности meta_grammar() и Py_meta_grammar(), как определено в metagrammar.c.

Хотя meta_grammar() определен в pgen.h, он дает неопределенную ошибку символа, несмотря на компиляцию (g++ для моего тестового кода) с -lpython3.3m. Быстрый подсчет показал, что meta_grammar() не является видимым символом в libpython3.3m.so, а Py_meta_grammar() - это. Однако при поиске исходного кода Python я не нашел ни одного заголовка, который объявлял бы Py_meta_grammar().

Я что-то пропустил? Где эти символы объявлены / определены?

1 ответ

Решение

Похоже, что после большого количества ошибок заголовки не объявляют _PyParser_Grammar. Тем не менее, декларируя

extern grammar _PyParser_Grammar;

в каждом из исходных файлов C++, которые нуждаются в доступе, работает отлично. Не особенно элегантно, но, по крайней мере, компилируется.

Другие вопросы по тегам