Python에서 알려진 상위 패키지 없이 시도된 상대 가져오기 해결

Olorunfemi Akinlua 2023년6월21일
Python에서 알려진 상위 패키지 없이 시도된 상대 가져오기 해결

Python의 상대 가져오기는 까다로울 수 있습니다. 특히 단일 디렉토리 내에서 여러 모듈을 처리할 때 그렇습니다. Python 코드베이스를 설계하는 방법에 따라 ImportError가 발생할 수 있습니다.

그러나 가져오기 시스템을 잘 이해하면 ImportError: 알려진 상위 패키지가 없는 상대 가져오기 시도를 포함하여 이러한 오류를 방지할 수 있습니다. 오류 메시지를 통해 문제가 발생할 수 있는 위치에서 문제를 쉽게 해결할 수 있습니다.

이 경우 부모 패키지가 존재하지 않기 때문입니다. 이 문서에서는 ImportError 문제를 해결하는 방법을 보여주고 설명합니다.

하위 모듈을 사용하여 Python에서 ImportError: 알려진 부모 패키지가 없는 상대 가져오기 시도 해결

ImportError: started relative import with no known parent package 오류는 아래 코드에서 .module_name 표현식을 사용할 때 발생합니다.

import .module_name

새 디렉터리 내에 세 개의 파일을 생성하여 문제를 복제해 보겠습니다. 아래 구조를 사용하여 테스트할 수 있습니다.

IError 디렉토리에는 모든 Python 코드가 있고 myPackage 디렉토리에는 모든 패키지 파일이 있습니다. 그런 다음 [main.py]myPackage.py에 액세스합니다.

IError/
    myPackage/
        __init__.py
        myNewPackage.py
    main.py

오류 메시지를 다시 생성하려면 __init__.py 파일만 있으면 됩니다. __init__.py 파일을 통해 Python 인터프리터는 디렉터리에 Python 모듈 코드(이 경우 myNewPackage.py)가 포함되어 있음을 알 수 있습니다.

오류를 다시 생성하기 전에 세 개의 Python 파일 모두에 포함될 코드를 작성해 보겠습니다.

myNewPackage.py 파일에는 아래 코드 스니펫이 있습니다.

def createSingleDict(name, value):
    return {"name": name, "value": value}

__init__.py 파일:

from .myNewPackage import createSingleDict

myPackage 모듈을 사용하는 main.py 파일:

import myPackage as pkg

User = pkg.createSingleDict("Jacob", 25)

print(User)

myNewPackage.py에는 두 개의 인수를 사용하고 전달된 인수가 있는 사전을 반환하는 단일 함수가 포함되어 있습니다. __init__.pyimport 문과 fromimport 키워드를 사용하여 myNewPackage.py__init__.py 파일로 가져옵니다.

main.pymyPackage.myNewPackage 표현식을 사용하지 않고 myPackage를 가져옵니다. 이 모든 것이 서브모듈로 인해 가능합니다.

__init__.py 파일과 그 안에 있는 명령문은 myNewPackage 파일(속성)이 상위(myPackage) 네임스페이스에 바인딩되는 하위 모듈 메커니즘을 로드합니다.

__init__.py 파일 내 명령문의 핵심 부분은 모듈 이름 앞의 입니다. 이렇게 하면 상위 모듈에 배치된 에 대한 바인딩이 가능합니다.

with no known parent package 오류 메시지 부분을 기억하십시오. 이것이 오류가 발생하는 이유입니다.

__init__.py 파일만 실행해 봅시다. 실행 결과는 아래와 같습니다.

Traceback (most recent call last):
  File "c:\Users\akinl\Documents\IError\myPackage\__init__.py", line 1, in <module>
    from .myNewPackage import createSingleDict
ImportError: attempted relative import with no known parent package

이 오류는 상위 네임스페이스 myPackage의 컨텍스트 없이 __init__.py 파일을 실행 중이기 때문에 발생합니다. 그러나 import 문인 import myPackage as pkg와 함께 main.py를 실행하면 오류가 발생하지 않습니다.

출력은 아래에서 볼 수 있습니다.

{'name': 'Jacob', 'value': 25}

따라서 .을 사용하지 마십시오. __init__.py 또는 ImportError: 알려진 부모 패키지 없이 상대 가져오기 시도를 방지하기 위한 부모 네임스페이스의 바인딩 또는 컨텍스트 내에 있지 않는 한 module_name 앞에 연산자.

무슨 일이 일어나고 있는지 더 잘 이해하려면 .를 제거하면 됩니다. __init__.pyimport 문 내에서 연산자를 사용하면 파일을 실행하는 데 오류가 발생하지 않습니다.

from myNewPackage import createSingleDict

그러나 main.py 파일을 실행하면 myNewPackage 모듈을 부모 모듈인 myPackage에 바인딩하지 않았기 때문에 아래와 같은 오류가 발생합니다.

Traceback (most recent call last):
  File "c:\Users\akinl\Documents\IError\tempCodeRunnerFile.py", line 1, in <module>
    import myPackage as pkg
  File "c:\Users\akinl\Documents\IError\myPackage\__init__.py", line 1, in <module>
    from myNewPackage import createSingleDict
ModuleNotFoundError: No module named 'myNewPackage'

코드를 실행하려면 .을 사용해야 합니다. main.pyimport 문 내에서 연산자를 사용하고 __init__.py 파일을 제거(삭제)합니다.

import myPackage.myNewPackage as pkg

User = pkg.createSingleDict("Jacob", 25)

print(User)

그러나 이것은 번거롭고 .를 사용하여 하위 모듈을 상위 모듈에 바인딩하는 것이 더 합리적입니다. __init__.py 내에서 연산자를 사용할 수 있지만 항상 상위 컨텍스트 내에서 실행 중인지 확인하십시오.

두 개의 하위 모듈이 있는 경우 동일한 방식으로 작동합니다. 새 하위 모듈 otherPackage.py에는 아래 코드가 포함될 수 있습니다.

def printName(name):
    print("The user's name is " + name)

__init__.py 파일을 업데이트하여 새 하위 모듈을 상위 네임스페이스에 바인딩합니다.

from .myNewPackage import createSingleDict
from .otherPackage import printName

그리고 main.py 내에서 다른 하위 모듈 내의 기능에 액세스하려면 별칭 pkg를 사용해야 합니다. 이것이 상위 네임스페이스에 바인딩하는 것의 장점이자 가져오기의 용이성입니다.

import myPackage as pkg

User = pkg.createSingleDict("Jacob", 25)

print(User)
pkg.printName("Jacob")

코드 출력:

{'name': 'Jacob', 'value': 25}
The user's name is Jacob

이 모든 것을 통해 Python 코드베이스 내에서 ImportError: 알려진 부모 패키지가 없는 상대 가져오기 시도를 방지하거나 해결하는 데 필요한 모든 정보를 얻을 수 있습니다.

Olorunfemi Akinlua avatar Olorunfemi Akinlua avatar

Olorunfemi is a lover of technology and computers. In addition, I write technology and coding content for developers and hobbyists. When not working, I learn to design, among other things.

LinkedIn

관련 문장 - Python Error