Python Exe 파일 실행 시 프로세스가 2개가 생기는 문제
이번에 새로 개발한 프로그램의 메뉴얼을 만들고 공유하는 과정에서 아래와 같은 이미지를 보고 다음과 같은 의문을 가졌습니다.
위 사진에서는 프로세스가 4개이지만, 실제로는 Watchdog - Main 프로그램이므로 프로세스는 2개가 나와야 하는 것이 맞습니다. 왜 Python 파일을 실행하는데 프로세스가 2개가 나오는 것일까. 자식 프로세스-부모 프로세스로 원래 2개가 실행되는 것일까?
고객사에서는 이러한 부분을 용납하지 않을 수도 있을 것이다라는 사항이 있어서 해당 부분의 해결을 필요로 합니다.
이의 해결을 위해서 여러 자료를 찾아보았지만, 국문으로 된 유용한 자료는 찾을 수 없었고 대신 해외 사이트 등을 통해서 확인하다가 알게 된 사실이 있었습니다.
출처는 다름아닌 PyInstaller Github이고, 링크는 다음과 같습니다.
https://github.com/pyinstaller/pyinstaller/issues/2483
요약하면 이렇습니다.
- PyInstaller로 EXE 파일을 만들 때, 한 개의 파일로 만들려는 시도가 있었습니다. (-F, –onefile 옵션)
- 그러나 한 개의 파일로 만들게 되면, 사실상 여러 모듈을 포함한 압축 파일의 형태가 되기 때문에 실제 실행은 windows 내의 temp 디렉토리를 생성해서 압축을 해체한 후 실행된 형태가 됩니다.
- 그래서 temp 디렉토리에서 한 번 실행, 또 한번은 압축된 exe 파일에서 자체적으로 실행되어 2개의 중복 프로세스가 발생하게 되고, temp 디렉토리를 비워줘야 프로세스가 1개만 실행됩니다.
그러나 매 번 실행할 때마다 temp 디렉토리를 비워줄 수는 없고, 결국은 압축된 1개의 EXE 파일이 아니라 대신에 1개의 디렉토리 내에서 모듈을 컴파일하는 형태로 이루어져야 합니다.
아래 사진은 PyInstaller를 사용해서 -F(또는 –onefile) 옵션을 사용하지 않는 대신, -D(또는 –onedir) 옵션을 사용하여 압축하지 않고 컴파일된 디렉토리 형태로 나타낸 결과입니다.
위 사진과 같이 EXE 파일이 생성된 것은 동일하지만 압축된 EXE가 아닌 실행 가능한 형태이며, 해당 프로그램 실행에 필요한 라이브러리 및 모듈은 모두 컴파일된 형태로 변환된 것을 확인할 수 있습니다.
이 상태에서 프로그램을 실행했을 때 결과는 다음과 같습니다.
프로세스가 중복되지 않고 한 개씩만 나타난 것을 확인할 수 있습니다.
하나의 파일로 Portable할 수 있게 관리하고 싶으면 One File 형태로 나타내는 것도 좋지만, 일반적인 설치형 프로그램을 사용할 경우에는 One Directory로 사용하는 것을 권장해야 할 것 같습니다.