2012-04-23 3 views
2

현재 파이썬 인터프리터를 내 응용 프로그램에 포함하려고합니다. 내 응용 프로그램은 로깅을 위해 Poco API를 사용하기 때문에 파이썬에서도 로깅 모듈을 통해 액세스 가능하게 만들고 싶습니다. 가장 쉬운 방법은 메시지를 로깅하고 이러한 함수를 호출하는 Handler 하위 클래스를 작성하는 확장 모듈로 정적 함수 세트를 제공하는 것입니다. 내가 추가 파이썬 모듈과 내 임베디드 파이썬 인터프리터의 외부에 내 코드를 재사용하기위한 요구 사항을 해달라고 이후를 설치하는 사용자를 싶지 않는 때문에 하나가 바로 다음 Py_InitModule()과를 통해 정적 기능을 제공 할 수 있다면Python/C-Api : 모듈에 클래스 추가

, 그것은 좋은 것입니다 생성 된 모듈에 하드 코드 된 Handler 서브 클래스를 추가합니다 (하드 코드 된 (hardcoded)은 런타임에 추가되었지만 실제로는 초기화시 항상 해석되는 const 문자열 임). 그것은 주어진 모듈에 추가하고 다음 accesable되도록

class Test: 
    someVar=1 

, 예를 들어 mymodule.Test

A :

내 문제는 내가 정상적인 파이썬 클래스 정의, 예를 해석하는 방법을 잘 모릅니다이다 솔루션은 순수 파이썬 기반이거나 파이썬 c-api로 작업 할 수 있습니다.

+0

이 당신이 클래스를 만들거나 모듈에 추가 도움이 필요합니까? –

+0

@ IgnacioVazquez-Abrams 모듈에 추가하기 – Paranaix

답변

1

드디어 자신이 answere을 발견 : 모듈의 컨텍스트에서 코드를 실행하는이 방법은

방법 1

PyObject* module = Py_InitModule("poco",LoggingPocoMethods); 
PyObject* code = Py_CompileString("class Test:\n\tdef __repr__(self):\n\t\treturn 'Hello world'","",Py_file_input); 
PyImport_ExecCodeModule("poco",code); 

이 방법은 단점이 실제로있다 모듈이 것 이 단계에서 필요하지 않은 다시로드하십시오.

방법

PyObject* module = Py_InitModule("poco",LoggingPocoMethods); 
PyObject* mainModule = PyImport_AddModule("__main__"); 

PyObject* dict = PyModule_GetDict(module); 
PyObject* mainDict = PyModule_GetDict(mainModule); 

PyRun_String("def test():\n\tprint 'test'\n",Py_file_input,mainDict,dict); 
0

무언가를 모듈에 넣으려면 할당하십시오. 클래스 테스트를 가정하면, 그 이름 인 MyModule을 모듈에 첨부 단지 그것 뿐이다

mymodule.Test = Test 

를 작성, 위와 같이 정의된다.

+0

원하는 모듈을 가져올 때 작동하지만, 단지'Py_InitModule()'을 호출했을 때 작동하지 않습니다. – Paranaix