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

기술 · 실용 가이드

터미널에서는 되는데 systemd에서 ModuleNotFoundError? 인터프리터와 sys.path부터 증명하세요

재설치 전에 서비스의 Python, prefix, 사용자, 작업 디렉터리와 검색 경로를 기록하고, 증명된 경계 하나만 고친 뒤 같은 프로브를 반복합니다.

원본 일러스트: Python·사용자·cwd·sys.path 비교.
원본 일러스트: 셸과 systemd에서 같은 사실을 수집합니다. Watch at Ease

systemd에서만 나는 ModuleNotFoundError는 증거가 나올 때까지 실행 경계 차이로 봅니다. Python, venv, 사용자, HOME, cwd 또는 검색 경로가 셸과 다를 수 있습니다.

sudo pip, chmod, 전역 PYTHONPATH, activate부터 시도하지 마세요. 두 환경에서 같은 작은 프로브를 수집하고 차이가 입증된 항목 하나만 되돌릴 수 있게 수정합니다.

실패한 서비스와 성공한 셸 고정

unit, 핵심 속성, journal traceback을 저장하고 비밀은 남기지 않습니다.

성공 셸과 서비스 계정에서 같은 id, pwd, Python, pip, 프로브를 수집합니다.

import 경계 장부 만들기

executable, prefix, cwd, uid/gid, HOME, sys.path, find_spec을 기록합니다.

같은 Python의 -m pip show를 쓰고 다른 pip 목록을 증거로 삼지 않습니다.

첫 차이 분류

Python이 다르면 ExecStart를 venv Python으로 지정합니다. activate는 필요 없습니다.

cwd만 다르면 절대 WorkingDirectory 또는 패키징을 고칩니다.

증상 아닌 패키지 경계 수정

재현 가능한 서비스 전용 환경과 그 Python의 -m pip를 사용합니다.

Environment는 비밀 아닌 값만, PYTHONPATH는 좁은 시험만 하며 root로 숨기지 않습니다.

reload·restart 후 같은 프로브

필요하면 daemon-reload와 restart 뒤 같은 장부를 다시 수집합니다.

실제 작업과 journal을 확인하고 재부팅 후 최소 권한으로 import돼야 종료합니다.

실패 분기로 가짜 수정 배제

pip show는 되지만 find_spec이 비면 배포명/import명, 선택 구성요소, editable 경로를 확인합니다.

200/CHDIR은 cwd, ExecStart 미발견은 실행 파일부터 고칩니다.

원본 일러스트: 관찰에서 제한된 수정과 검증으로 이동.
원본 일러스트: 증거가 다른 경계만 바꿉니다. Watch at Ease