기술 · 실용 가이드
attempted relative import with no known parent package? 먼저 실행 컨텍스트를 증명하세요
선행 점보다 파일이 어떻게 시작됐는지가 핵심입니다. __package__와 __spec__을 기록한 뒤 패키지 모듈, 설치된 명령, 독립 스크립트 중 하나의 진입점 계약을 고르세요.

실패한 것과 완전히 같은 명령을 실행하고 가져오기를 바꾸기 전에 __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]로 안정적인 명령을 만들거나 얇은 독립 실행기를 패키지 밖에 두고 절대 가져오기를 사용하세요. 마지막에 같은 명령을 다시 실행하고 모듈 출처와 패키지 메타데이터를 종료 증거로 기록하세요. 유효한 종료 증거는 실제 시작 명령을 반복하고 예상 패키지 메타데이터와 가져온 출처를 기록합니다.
