[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.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.파이썬 인터프리터는 임베딩 프로그램과는 별도의 스레드에서 실행되어야합니다. 그렇지 않으면 단순히 인터프리터를 인터럽트 할 수있는 기회를 얻지 못할 것입니다.
파이썬 인터프리터는 임베딩 프로그램과는 별도의 스레드에서 실행되어야합니다. 그렇지 않으면 단순히 인터프리터를 인터럽트 할 수있는 기회를 얻지 못할 것입니다.
그럴 때 파이썬 API 예외 호출 중 하나를 사용하여 인터프리터에서 예외를 트리거 할 수 있습니까? Python C API 예외 참조
from https://stackoverflow.com/questions/1420957/stopping-embedded-python by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] C / C ++ 프로그램에서 호출 된 여러 운영 체제 스레드에 대한 독립적 인 임베디드 Python 인터프리터 여러 개 (0) | 2018.11.07 |
---|---|
[PYTHON] Python에서 피클 파일을로드하는 데 걸리는 시간을 줄이는 방법 (0) | 2018.11.07 |
[PYTHON] 파이썬에서 파일의 인코딩을 아는 법? [복제] (0) | 2018.11.07 |
[PYTHON] Jinja2 템플릿 언어에 '여기'(현재 디렉토리)라는 개념이 있습니까? (0) | 2018.11.07 |
[PYTHON] `import __main__`을 사용하는 것이 좋은 습관입니까? (0) | 2018.11.07 |