2013-06-28 2 views
1

Python/C API의 PyRun_InteractiveLoop() 함수를 에뮬레이트하려고하지만 내 고용주가 사용하는 다른 입력 시스템에서 시도하고 있습니다.Embedding 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위한 변수 선언되지 않은 오류를 범 : 주어진 문자 배열은 전체 파이썬 블록이면 파이썬 FAQ (http://docs.python.org/3/faq/extending.html#how-do-i-tell-incomplete-input-from-invalid-input)을 확인하는데 사용되는 다음의 코드를 갖는다. 파이썬 소스 코드를 검색 할 때 _PyParser_Grammar를 선언 한 헤더를 찾지 못했습니다. 더 자세히 살펴보면, metagrammar.c에 정의 된대로, 특히 meta_grammar() 및 Py_meta_grammar()와 같은 몇 가지 함수에서 참조되는 것을 발견했습니다.

meta_grammar()는 pgen.h에 정의되어 있지만 -lpython3.3m을 사용하여 컴파일 (g ++는 테스트 코드 용)되었지만 정의되지 않은 기호 오류가 발생합니다. 빠른 nm은 Py_meta_grammar()가 libpython3.3m.so에서 볼 수있는 기호가 아니라는 것을 meta_grammar()가 밝혀 냈습니다. 그러나 Python 소스 코드를 검색 할 때 Py_meta_grammar()를 선언하는 헤더를 찾지 못했습니다.

내가 누락 된 항목이 있습니까? 이 기호들은 어디에 선언/정의되어 있습니까?

답변

2

대단한 생각을 한 끝에 _PyParser_Grammar를 선언하는 헤더가없는 것 같습니다. 그러나 액세스가 필요한 각 C++ 소스 파일에서

extern grammar _PyParser_Grammar; 

을 완벽하게 작동해야한다고 선언합니다. 특별히 우아하지는 않지만 적어도 컴파일은 가능합니다.

+0

_Win_의 경우 (정적으로 연결된 _Python_ __isn't__ - 기본값입니다. 다른 방법이 있을지 모르겠 음) 선언은 'extern __declspec (dllimport) grammar _PyParser_Grammar;'여야합니다. – CristiFati