2013-02-26 6 views
2

조금 혼란 스럽습니다. 일부 C++ 및 Python 통합을 시도하고 있지만 간단하지 않습니다. Boost :: Python을 제대로 컴파일 할 수 없으므로 Boost를 사용하지 않습니다. 그러나 그것은 또 다른 이야기입니다.PyObject의 C++ 및 Python 검사 유형이 실패합니다.

현재

, 여기에 내가 C++로하고있어 무엇 :

//set everything up 
PyObject* py_main_module = PyImport_AddModule("__main__"); 
PyObject* py_global_dict = PyModule_GetDict(py_main_module); 
PyObject* py_local_dict = PyDict_New(); 
PyObject* py_return_value; 

PyRun_SimpleString(data.c_str()); //runs Python code, which defines functions 

//call a function defined by the python code 
py_return_value = PyRun_String("test()", Py_single_input, py_global_dict, py_local_dict); 

//attempt to check the type of the returned value 
if(py_return_value != NULL) { 
    //this is the problem: all of these print 0 
    cout << PyList_Check(py_return_value) << endl; 
    cout << PySet_Check(py_return_value) << endl; 
    cout << PyFloat_Check(py_return_value) << endl; 
} else { 
    cout << "IT WAS NULL?!" << endl; 
} 

파이썬 프로그램 (라는 문자열로 C++ 프로그램 "데이터"에 입력) :

def test(): 
    derp = 1.234 
    #derp = [1, 2, 3, 4] 
    #derp = set([1, 2, 3, 4]) 
    return derp 

자,가 문제는 형식 검사가 작동하지 않는다는 것입니다. 파이썬 함수가 부동 소수점,리스트 또는 집합을 반환하는지 여부에 관계없이 모두 0을 반환합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

누구나 PyRun_String을 호출하면 콘솔에 반환 된 값이 인쇄되는 이유를 알 수 있습니다. 정말 짜증나.

답변

3

:

int Py_eval_input

고립 표현을위한 파이썬 문법에서 시작 기호; Py_CompileString()과 함께 사용하십시오.

int Py_file_input

문 시퀀스 파이썬 문법에서 시작 심볼 파일이나 다른 소스에서 읽을; Py_CompileString()과 함께 사용하십시오. 이것은 임의로 긴 Python 소스 코드 을 컴파일 할 때 사용할 심볼입니다.

int Py_single_input

하나의 문에 대한 파이썬 문법에서 시작 기호; Py_CompileString()과 함께 사용하십시오. 이 문자는 대화 형 인터프리터 루프에 사용되는 기호입니다.

Py_single_input와 같은 문자열을 평가합니다. 문은 본질적으로 아무 것도 반환하지 않으므로 PyRun_String에서 None을 다시 얻을 수 있습니다. Py_eval_input을 사용하여 문자열을 표현으로 평가하고 결과를 얻으십시오.

+0

고마워요! 그것은 정말로 내 문제 모두를 해결합니다. 반환 값 외에도 명령문이나 표현식으로 평가하는 것의 차이점은 무엇입니까? 아니면 그 유일한 차이점은 무엇입니까? –

+0

표현식은 값을 생성 할 수 있습니다. 예제는'x - 1','foo (blah)','lambda x : y'입니다. 문장은 Python의 일반적인 코드 행이며,'x = 1'이라는 할당과 함수 정의를 포함합니다. 표현 자체는 명령문이 될 수 있지만 모든 명령문이 표현식으로 취급 될 수있는 것은 아닙니다. (표현식은 함수에 전달할 수있는 것으로 생각할 수 있습니다.) – nneonneo

2

Py_single_input에서 Py_eval_input으로 변경하면 두 가지 문제가 해결되는 것으로 보입니다.

전자는 인터프리터 루프의 일부로 문자열을 처리하지만 후자는 단일 표현식을 평가하고 객체를 다시 제공합니다. (반환 값이 전의 경우에서 의미하는 것이 확실하지 않지만 표현식의 값이 아닙니다.)

EDIT : 그냥 테스트 해본 결과 nneonneo의 답변은 아래와 같습니다. Py_single_input은 실제로 Py_None입니다. the docs에서

+0

확인해 주셔서 감사합니다. 두 가지 문제를 모두 해결합니다. –