我試圖模擬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塊:嵌入Python 3.3:如何訪問_PyParser_Grammar?
#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()的頭文件。
我錯過了什麼嗎?這些符號在哪裏被聲明/定義?
如果你在_Win_(和_Python_ __靜態鏈接 - 這是默認的,我不知道是否有可能),聲明應該是:'extern __declspec(dllimport)grammar _PyParser_Grammar;'。 – CristiFati