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

기술 · 실용 가이드

attempted relative import with no known parent package? 먼저 실행 컨텍스트를 증명하세요

선행 점보다 파일이 어떻게 시작됐는지가 핵심입니다. __package__와 __spec__을 기록한 뒤 패키지 모듈, 설치된 명령, 독립 스크립트 중 하나의 진입점 계약을 고르세요.

Python 파일 직접 실행과 python -m 패키지 실행의 메타데이터를 비교한 오리지널 도표.
오리지널 편집 일러스트: 직접 실행에는 부모 패키지가 없을 수 있고 -m은 패키지 정체성을 제공합니다. Watch at Ease

실패한 것과 완전히 같은 명령을 실행하고 가져오기를 바꾸기 전에 __name__, __package__, __spec__, sys.argv, 현재 작업 디렉터리, sys.path[0]을 출력하세요. 파일이 패키지처럼 보이는 폴더 안에 있어도 최상위 __main__으로 실행될 수 있습니다. Python 문서에 따르면 소스 파일을 직접 실행하면 __main__.__spec__은 None이므로 선행 점을 고정할 부모 패키지 정보가 없습니다.

지속 가능한 수리는 점을 더 시도하는 것이 아닙니다. 코드를 패키지 모듈, 설치된 명령 또는 독립 스크립트 중 무엇으로 제공할지 정하세요. 최상위 패키지를 포함한 디렉터리에서 python -m package.module을 실행하거나 [project.scripts]로 안정적인 명령을 만들거나 얇은 독립 실행기를 패키지 밖에 두고 절대 가져오기를 사용하세요. 마지막에 같은 명령을 다시 실행하고 모듈 출처와 패키지 메타데이터를 종료 증거로 기록하세요.

1. 더 깨끗한 대체 명령이 아니라 실패한 실행을 기록

실패한 것과 완전히 같은 명령을 실행하고 가져오기를 바꾸기 전에 __name__, __package__, __spec__, sys.argv, 현재 작업 디렉터리, sys.path[0]을 출력하세요. 파일이 패키지처럼 보이는 폴더 안에 있어도 최상위 __main__으로 실행될 수 있습니다. Python 문서에 따르면 소스 파일을 직접 실행하면 __main__.__spec__은 None이므로 선행 점을 고정할 부모 패키지 정보가 없습니다. 소스 파일을 직접 실행하면 가져올 수 있는 파일이어도 __main__.__spec__은 None입니다.

지속 가능한 수리는 점을 더 시도하는 것이 아닙니다. 코드를 패키지 모듈, 설치된 명령 또는 독립 스크립트 중 무엇으로 제공할지 정하세요. 최상위 패키지를 포함한 디렉터리에서 python -m package.module을 실행하거나 [project.scripts]로 안정적인 명령을 만들거나 얇은 독립 실행기를 패키지 밖에 두고 절대 가져오기를 사용하세요. 마지막에 같은 명령을 다시 실행하고 모듈 출처와 패키지 메타데이터를 종료 증거로 기록하세요. python -m은 표준 가져오기 시스템으로 모듈을 찾고 모듈 메타데이터를 제공합니다.

2. 패키지 루트와 정규화된 모듈 이름을 증명

실패한 것과 완전히 같은 명령을 실행하고 가져오기를 바꾸기 전에 __name__, __package__, __spec__, sys.argv, 현재 작업 디렉터리, sys.path[0]을 출력하세요. 파일이 패키지처럼 보이는 폴더 안에 있어도 최상위 __main__으로 실행될 수 있습니다. Python 문서에 따르면 소스 파일을 직접 실행하면 __main__.__spec__은 None이므로 선행 점을 고정할 부모 패키지 정보가 없습니다. python -m은 표준 가져오기 시스템으로 모듈을 찾고 모듈 메타데이터를 제공합니다.

지속 가능한 수리는 점을 더 시도하는 것이 아닙니다. 코드를 패키지 모듈, 설치된 명령 또는 독립 스크립트 중 무엇으로 제공할지 정하세요. 최상위 패키지를 포함한 디렉터리에서 python -m package.module을 실행하거나 [project.scripts]로 안정적인 명령을 만들거나 얇은 독립 실행기를 패키지 밖에 두고 절대 가져오기를 사용하세요. 마지막에 같은 명령을 다시 실행하고 모듈 출처와 패키지 메타데이터를 종료 증거로 기록하세요. 상대 가져오기는 폴더 모양이 아니라 현재 모듈의 패키지 이름을 기준으로 해결됩니다.

3. 하나의 진입점 계약만 선택

실패한 것과 완전히 같은 명령을 실행하고 가져오기를 바꾸기 전에 __name__, __package__, __spec__, sys.argv, 현재 작업 디렉터리, sys.path[0]을 출력하세요. 파일이 패키지처럼 보이는 폴더 안에 있어도 최상위 __main__으로 실행될 수 있습니다. Python 문서에 따르면 소스 파일을 직접 실행하면 __main__.__spec__은 None이므로 선행 점을 고정할 부모 패키지 정보가 없습니다. 상대 가져오기는 폴더 모양이 아니라 현재 모듈의 패키지 이름을 기준으로 해결됩니다.

지속 가능한 수리는 점을 더 시도하는 것이 아닙니다. 코드를 패키지 모듈, 설치된 명령 또는 독립 스크립트 중 무엇으로 제공할지 정하세요. 최상위 패키지를 포함한 디렉터리에서 python -m package.module을 실행하거나 [project.scripts]로 안정적인 명령을 만들거나 얇은 독립 실행기를 패키지 밖에 두고 절대 가져오기를 사용하세요. 마지막에 같은 명령을 다시 실행하고 모듈 출처와 패키지 메타데이터를 종료 증거로 기록하세요. 작업 디렉터리만 바꿔서는 직접 파일 실행이 패키지 실행으로 바뀌지 않습니다.

4. 사고만 옮기는 수리를 거부

실패한 것과 완전히 같은 명령을 실행하고 가져오기를 바꾸기 전에 __name__, __package__, __spec__, sys.argv, 현재 작업 디렉터리, sys.path[0]을 출력하세요. 파일이 패키지처럼 보이는 폴더 안에 있어도 최상위 __main__으로 실행될 수 있습니다. Python 문서에 따르면 소스 파일을 직접 실행하면 __main__.__spec__은 None이므로 선행 점을 고정할 부모 패키지 정보가 없습니다. 작업 디렉터리만 바꿔서는 직접 파일 실행이 패키지 실행으로 바뀌지 않습니다.

지속 가능한 수리는 점을 더 시도하는 것이 아닙니다. 코드를 패키지 모듈, 설치된 명령 또는 독립 스크립트 중 무엇으로 제공할지 정하세요. 최상위 패키지를 포함한 디렉터리에서 python -m package.module을 실행하거나 [project.scripts]로 안정적인 명령을 만들거나 얇은 독립 실행기를 패키지 밖에 두고 절대 가져오기를 사용하세요. 마지막에 같은 명령을 다시 실행하고 모듈 출처와 패키지 메타데이터를 종료 증거로 기록하세요. 설치된 project script는 가져올 수 있는 모듈 함수를 호출해 내부 파일을 명령 경계로 쓰지 않습니다.

5. 진단을 지우기 전에 종료 증거 정의

실패한 것과 완전히 같은 명령을 실행하고 가져오기를 바꾸기 전에 __name__, __package__, __spec__, sys.argv, 현재 작업 디렉터리, sys.path[0]을 출력하세요. 파일이 패키지처럼 보이는 폴더 안에 있어도 최상위 __main__으로 실행될 수 있습니다. Python 문서에 따르면 소스 파일을 직접 실행하면 __main__.__spec__은 None이므로 선행 점을 고정할 부모 패키지 정보가 없습니다. 설치된 project script는 가져올 수 있는 모듈 함수를 호출해 내부 파일을 명령 경계로 쓰지 않습니다.

지속 가능한 수리는 점을 더 시도하는 것이 아닙니다. 코드를 패키지 모듈, 설치된 명령 또는 독립 스크립트 중 무엇으로 제공할지 정하세요. 최상위 패키지를 포함한 디렉터리에서 python -m package.module을 실행하거나 [project.scripts]로 안정적인 명령을 만들거나 얇은 독립 실행기를 패키지 밖에 두고 절대 가져오기를 사용하세요. 마지막에 같은 명령을 다시 실행하고 모듈 출처와 패키지 메타데이터를 종료 증거로 기록하세요. 유효한 종료 증거는 실제 시작 명령을 반복하고 예상 패키지 메타데이터와 가져온 출처를 기록합니다.

Python 패키지 모듈 또는 독립 스크립트 진입점을 선택하고 결과를 검증하는 오리지널 결정도.
오리지널 편집 일러스트: 하나의 진입점 계약을 고른 뒤 같은 명령이 의도한 모듈을 가져오는지 증명합니다. Watch at Ease