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__.py
는 import
문과 from
및 import
키워드를 사용하여 myNewPackage.py
를 __init__.py
파일로 가져옵니다.
main.py
는 myPackage.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__.py
의 import
문 내에서 연산자를 사용하면 파일을 실행하는 데 오류가 발생하지 않습니다.
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.py
의 import
문 내에서 연산자를 사용하고 __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 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
- AttributeError 수정: Python에서 'generator' 객체에 'next' 속성이 없습니다.
- AttributeError 해결: 'list' 객체 속성 'append'는 읽기 전용입니다.
- AttributeError 해결: Python에서 'Nonetype' 객체에 'Group' 속성이 없습니다.
- AttributeError: 'Dict' 객체에 Python의 'Append' 속성이 없습니다.
- AttributeError: 'NoneType' 객체에 Python의 'Text' 속성이 없습니다.
- AttributeError: Int 객체에 속성이 없습니다.