복붙노트

[PYTHON] 임베디드 파이썬 중지

PYTHON

임베디드 파이썬 중지

파이썬 인터프리터를 C 프로그램에 삽입하고 있습니다. 그러나 PyRun_SimpleString ()을 통해 Python 스크립트를 실행하는 동안 무한 루프로 실행되거나 너무 오래 실행될 수 있습니다. 고려 PyRun_SimpleString ( "while 1 : pass"); 주 프로그램이 막히는 것을 막기 위해 나는 인터프리터를 실에서 실행할 수 있다고 생각했다.

임베디드 인터프리터에서 전체 프로세스를 죽이지 않고 스레드에서 실행중인 python 스크립트 실행을 중단하려면 어떻게합니까?

통역사에게 예외를 전달할 수 있습니까? 신호를 듣는 다른 스크립트로 스크립트를 래핑해야합니까?

추신 : 나는 별도의 프로세스에서 파이썬을 실행할 수 있지만 이것이 내가 원하는 것이 아니다. 최후의 수단이 아니면 ...

최신 정보:

이제 작동합니다. Denis Otkidach, 다시 한번 감사드립니다!

이 권리가 있다면, 두 가지를해야합니다 : PyRun_SimpleString ()이 실행 중일 때 인터프리터에게 멈추고 -1을 같은 스레드에서 반환하도록 지시하십시오.

PyErr_SetString (PyExc_KeyboardInterrupt, "...") 또는 PyErr_SetInterrupt () - Python이 몇 가지 더 많은 명령어를 실행하고 나면 멈출 수 있으며 나중에 실행이 중지됩니다.

-1을 반환하려면 Py_AddPendingCall ()을 사용하여 Python 실행에 함수 호출을 삽입하십시오. 문서는 버전 2.7 및 3.1 이후로 언급하고 있지만 이전 Pythons에서도 실행됩니다 (여기에서는 2.6). 2.7과 3.1에서 GIL (?)을 획득하지 않고 호출 할 수 있다는 의미이므로 스레드로부터 안전해야합니다.

따라서 다음 예제를 다시 작성할 수 있습니다.

int quit() {
    PyErr_SetInterrupt();
    return -1;
}

해결법

  1. ==============================

    1.Py_AddPendingCall ()을 사용하여 다음 검사 간격에서 호출 할 함수 발생 예외를 추가 할 수 있습니다 (자세한 내용은 sys.setcheckinterval () 문서 참조). 다음은 Py_Exit () 호출을 사용하는 예제입니다 (나에게 효과가 있지만, 아마도 필요한 것은 아닐 것입니다). Py_Finalize () 또는 PyErr_Set * () 중 하나로 바꾸십시오.

    Py_AddPendingCall ()을 사용하여 다음 검사 간격에서 호출 할 함수 발생 예외를 추가 할 수 있습니다 (자세한 내용은 sys.setcheckinterval () 문서 참조). 다음은 Py_Exit () 호출을 사용하는 예제입니다 (나에게 효과가 있지만, 아마도 필요한 것은 아닐 것입니다). Py_Finalize () 또는 PyErr_Set * () 중 하나로 바꾸십시오.

    int quit(void *) {
        Py_Exit(0);
    }
    
    
    PyGILState_STATE state = PyGILState_Ensure();
    Py_AddPendingCall(&quit, NULL);
    PyGILState_Release(state);
    

    이것은 순수 파이썬 코드에 충분할 것입니다. 그러나 일부 C 함수는 한 번의 작업으로 잠시 동안 실행할 수 있습니다 (장기 실행 regexp 검색을 사용한 예제가 있지만 여전히 관련성이 있는지는 확실하지 않습니다).

  2. ==============================

    2.파이썬 인터프리터는 임베딩 프로그램과는 별도의 스레드에서 실행되어야합니다. 그렇지 않으면 단순히 인터프리터를 인터럽트 할 수있는 기회를 얻지 못할 것입니다.

    파이썬 인터프리터는 임베딩 프로그램과는 별도의 스레드에서 실행되어야합니다. 그렇지 않으면 단순히 인터프리터를 인터럽트 할 수있는 기회를 얻지 못할 것입니다.

    그럴 때 파이썬 API 예외 호출 중 하나를 사용하여 인터프리터에서 예외를 트리거 할 수 있습니까? Python C API 예외 참조

  3. from https://stackoverflow.com/questions/1420957/stopping-embedded-python by cc-by-sa and MIT license