2013-06-28 65 views
1

我試圖模擬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()的頭文件。

我錯過了什麼嗎?這些符號在哪裏被聲明/定義?

回答

2

經過了很長時間的推理後,似乎沒有聲明_PyParser_Grammar的頭文件。但是,聲明

extern grammar _PyParser_Grammar; 

在每個需要訪問的C++源文件中工作完美。不是特別優雅,但至少它編譯。

+0

如果你在_Win_(和_Python_ __靜態鏈接 - 這是默認的,我不知道是否有可能),聲明應該是:'extern __declspec(dllimport)grammar _PyParser_Grammar;'。 – CristiFati