C ++ 클래스로서 Python 통역사
-
18-09-2019 - |
문제
나는 Python을 C ++에 포함시키기 위해 노력하고 있습니다. 일부 독특한 경우에는 같은 스레드에서 통역사의 두 개의 별도 인스턴스가 필요합니다.
Python 통역사를 C ++ 클래스로 랩하고 둘 이상의 클래스 인스턴스에서 서비스를받을 수 있습니까?
해결책
다른 스레드의 다른 통역사에게 PY_NEWINGIRPRERTER를 사용했지만 한 스레드 내에서 여러 해석기에게도 작동해야합니다.
메인 스레드에서 :
Py_Initialize();
PyEval_InitThreads();
mainThreadState = PyEval_SaveThread();
각 통역사 인스턴스 (모든 스레드)에 대해 :
// initialize interpreter
PyEval_AcquireLock(); // get the GIL
myThreadState = Py_NewInterpreter();
... // call python code
PyEval_ReleaseThread(myThreadState); // swap out thread state + release the GIL
... // any other code
// continue with interpreter
PyEval_AcquireThread(myThreadState); // get GIL + swap in thread state
... // call python code
PyEval_ReleaseThread(myThreadState);
... // any other code
// finish with interpreter
PyEval_AcquireThread(myThreadState);
... // call python code
Py_EndInterpreter(myThreadState);
PyEval_ReleaseLock(); // release the GIL
각 통역사 인스턴스에 대해 변수 신화 상태가 필요합니다!
마지막으로 메인 스레드의 마무리 :
PyEval_RestoreThread(mainThreadState);
Py_Finalize();
여러 통역사 인스턴스를 사용하는 데는 제한 사항이 있습니다 (완전히 독립적이지 않은 것 같습니다). 대부분의 경우 문제를 일으키지 않는 것 같습니다.
다른 팁
전화 Py_Initialize()
그러나 두 번 잘 작동하지 않습니다 Py_NewInterpreter
당신이하려는 일에 따라 작동 할 수 있습니다. 문서를주의 깊게 읽으십시오. 이걸 호출 할 때 길을 잡아야합니다.
표준 구현이있을 때는 Python 통역사를 재 구현하지 않는 것이 좋습니다. 사용 부스트 :: 파이썬 파이썬과 인터페이스합니다.
나는 당신이 이것을하고 싶은 첫 번째 사람이라고 생각하지 않습니다. 불행히도 나는 그것이 불가능하다고 생각합니다. Python Interperters를 별도의 프로세스로 실행하고 RPC를 사용할 수 있습니까?
Mosaik의 답변은 내 상황에서 내 모듈이 이미 Python을 초기화하는 호스트 애플리케이션에 대한 플러그인 인 내 상황에서 작동하지 않았습니다. 다음 코드로 작업 할 수있었습니다.
// initialize interpreter
::PyEval_InitThreads();
::PyThreadState *mainThread = ::PyThreadState_Get();
myState = ::Py_NewInterpreter();
... // call python code
::PyThreadState_Swap(mainThread);
... // any other code
mainThread = ::PyThreadState_Swap(myState)
... // call python code
::PyThreadState_Swap(mainThread)
... // any other code
// finished with interpreter
mainThread = ::PyThreadState_Swap(myState)
::Py_EndInterpreter(myState);
::PyThreadState_Swap(mainThread)
내가 전화했을 때 PyEval_AcquireLock()
프로그램이 차단되었고 함수가 반환되지 않았습니다. 또한, 전화 PyEval_ReleaseThread(myState)
통역사도 무효화하는 것처럼 보였다.
- Python 통역사를 응용 프로그램 메모리 공간 밖에서 살도록 할 수 있습니다. 통역사를 DLL에 포함시킵니다.
- 파이썬 컨텍스트를 설정하고 저장하여 두 개의 다른 통역사를 시뮬레이션 할 수 있습니다.