버그 (처음부터 2007 년까지)가 nnorwitz에 의해 "wontfix"로 닫히고 그의 게시물이 버그 리포트에 있음을 알 수 있습니다.
왜 Py_Initialize/Py_Finalize
번을 두 번 이상 호출합니까? 왜 이런 걸 (I 좀 편의를 위해 C와 파이썬을 혼합하고 있습니다)하지 :
/* startup */
Py_Initialize();
/* do whatever */
while (moreFiles()) {
PyRun_SimpleString("execfile('%s')" % nextFile());
/* do whatever */
}
/* shutdown */
Py_Finalize();
문제는 파이썬 모듈을 작성 대부분의 사람들은 자신의 모듈을 경우 발생하는 걱정하지 않아도됩니다 최종화 및 재 초기화되고, 종종 최종화 동안 정리에 신경 쓰지 않습니다. 모듈 작성자는 프로세스가 종료 될 때 모든 메모리가 해제된다는 것을 알고 있으므로 그 이상으로 신경 쓰지 않아도됩니다.
정말 하나의 버그는 아니지만 실제로는 수천 개의 버그입니다. 각 확장 모듈마다 하나씩 있습니다. 이는 소수의 사용자에게 영향을주는 버그에 대해 엄청난 양의 작업이며, 그 중 대부분은 실행 가능한 해결 방법이 있습니다.
언제든지 Py_Finalize
에 대한 호출을 생략하고 Py_Initialize
을 호출하면 다시 작업 할 수 있습니다. 즉, 응용 프로그램이 Python 스크립트를 처음 실행할 때 추가 메모리 사용을 사용하고 종료 할 때까지 추가 메모리가 OS로 반환되지 않습니다. 한동안 매번 Python 스크립트를 실행하는 한, 누수로 분류하지는 않습니다. 귀하의 응용 프로그램은 Valgrind - 깨끗한되지 않을 수도 있지만 그것은 체처럼 새는 것보다 낫다.
메모리 누수를 피하기 위해 (순수한) 파이썬 모듈을 언로드해야하는 경우 그렇게 할 수 있습니다. sys.modules
에서 삭제하십시오. Py_Finalize
의
단점 : 당신이 반복적으로 파이썬 스크립트를 실행하는 경우, 그것은 그들 사이 Py_Finalize
를 실행하는 많은 이해가되지 않습니다. 다시 초기화 할 때마다 모든 모듈을 다시로드해야합니다. 내 파이썬 부팅시 28 모듈을로드합니다.
추가 설명 : 버그는 파이썬으로 국한되지 않습니다. 어떤 언어로든 상당량의 라이브러리 코드는 라이브러리를 언로드하고 다시로드하려고하면 메모리가 누수됩니다. 많은 라이브러리가 C 코드를 호출합니다. 많은 C 프로그래머는 라이브러리가 한 번로드되고 프로세스가 종료 될 때 언로드한다고 가정합니다.
간단한 솔루션이 없다는 점에 다소 실망 스럽지만 감사합니다. 적어도 현재의 접근 방법을 검증합니다. – user1140116
성취하고자하는 것은 무엇입니까? (종종, * 해결할 수 있습니다.) –
파이썬 스크립트를 반복적으로 실행할 파이썬 IDE를 만들고 있습니다. 스크립트가 실행될 때마다 프로그램에서 사용하는 메모리가 증가합니다. 나는 응용 프로그램 시작시 Py_Initialize를 호출하고 Py_Finalize를 호출하지 않습니다 (boost :: python에 의해 호출 됨). 스크립트에는 PyOpenGL과 PyQt를 포함한 라이브러리가 포함되어 있습니다. 특히 QImage를 사용할 때 메모리가 할당 해제되지 않는 문제가 발생했습니다. – user1140116