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() を宣言するヘッダーは見つかりませんでした。
何か不足していますか?これらのシンボルはどこで宣言/定義されていますか?