Watch at Ease세상을 읽고, 일상의 답을 찾다.

기술 · 실용 가이드

Python “bootstrapping phase” 오류? spawn이 다시 import한 경로부터 증명하세요

child interpreter가 entry module을 다시 import하는 동안 import path가 또 process를 시작했다는 뜻입니다. start method와 launcher를 기록하고 전체 생성 경로를 실제 entry boundary 안으로 옮기세요.

Python “bootstrapping phase” 오류? spawn이 다시 import한 경로부터 증명하세요
원본 기술 일러스트: parent and child import boundary. Watch at Ease

child interpreter가 entry module을 다시 import하는 동안 import path가 또 process를 시작했다는 뜻입니다. start method와 launcher를 기록하고 전체 생성 경로를 실제 entry boundary 안으로 옮기세요.

원래 launcher에서 다시 실행해 parent 하나만 시작되고 의도한 workers가 한 번씩 실행되며 process method 강제 변경 없이 정상 종료되어야 수정이 완료됩니다.

1. 실패 launch path 고정

첫 RuntimeError의 전체 traceback과 Python, OS, sys.executable, sys.argv, __name__, __file__, get_start_method(), 실제 launcher를 저장합니다.

_check_not_importing_main 직전의 최상위 application frame이 child import 중 어떤 경로가 process를 다시 만들었는지 보여 줍니다.

2. import 작업과 entry 작업 분리

definition, constant, import-safe setup은 module scope에 둘 수 있습니다. Pool, Process, Manager, ProcessPoolExecutor와 worker를 만드는 library call은 main()으로 옮겨 __main__ guard에서만 호출합니다.

entry module이 import 중 helper를 호출했다면 helper 내부 guard는 늦습니다. worker target은 importable·picklable하도록 module scope에 둡니다.

3. start method 실측

Windows는 spawn, 최신 macOS도 spawn이 기본입니다. Python 3.14부터 지원되는 POSIX 기본은 fork에서 forkserver로 바뀌어 upgrade 뒤 recursive import가 드러날 수 있습니다.

오류를 숨기려고 fork를 강제하지 마세요. 필요하면 application boundary에서 get_context를 쓰고 imported module 깊은 곳에서 global method를 바꾸지 마세요.

4. frozen app과 third-party pool 분기

일반 interpreter에서는 freeze_support를 생략할 수 있습니다. PyInstaller는 같은 executable을 child로 다시 실행하므로 override하며 보통 guarded entry에서 호출합니다. import가 더 일찍 multiprocessing이나 GUI를 시작할 때만 앞당깁니다.

traceback이 library로 들어가면 n_jobs, workers, processes가 pool을 만드는지 확인합니다. single worker는 진단일 뿐 parallelism 복구 후에도 entry가 안전해야 합니다.

5. 같은 launcher로 검수

기존 process tree를 종료하고 동일 launcher와 environment로 fresh run합니다. guard는 parent에서만, worker target은 children에서만 실행되고 output은 한 번이며 orphan이 없어야 합니다.

traceback, launcher, start method, call chain, code movement, fresh result를 한 audit record에 보관하고 source와 packaged form을 모두 테스트합니다.

Python “bootstrapping phase” 오류? spawn이 다시 import한 경로부터 증명하세요
원본 기술 일러스트: guarded entry, packaging branch and fresh-run acceptance. Watch at Ease