2

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() を宣言するヘッダーは見つかりませんでした。

何か不足していますか?これらのシンボルはどこで宣言/定義されていますか?

4

1 に答える 1

3

いろいろいじった後、_PyParser_Grammar を宣言するヘッダーがないようです。ただし、宣言する

extern grammar _PyParser_Grammar;

アクセスが必要な各 C++ ソース ファイルでは、完全に機能します。特にエレガントではありませんが、少なくともコンパイルされます。

于 2013-07-15T16:29:55.113 に答える