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

Я пытаюсь эмулировать функцию PyRun_InteractiveLoop () API Python / C, но из другой системы ввода, используемой моим работодателем. FAQ по Python (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. Заглядывая дальше, я обнаружил, что на него ссылаются несколько функций, в частности 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 ++, которые нуждаются в доступе, работает отлично. Не особенно элегантно, но, по крайней мере, компилируется.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]