문제

나는 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에 포함시킵니다.
  • 파이썬 컨텍스트를 설정하고 저장하여 두 개의 다른 통역사를 시뮬레이션 할 수 있습니다.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top