ImportError 수정: Python에서 이름을 가져올 수 없음
이 설명을 통해 ImportError: cannot import name
오류가 발생하는 이유를 알아봅니다. 또한 Python에서 이러한 종류의 오류를 수정하는 방법도 배웁니다.
Python에서 ImportError: can import name
오류의 원인
이 오류를 수정하는 몇 가지 방법을 사용할 수 있지만 이 오류를 수정하는 방법에 대해 알아보기 전에 이 오류가 발생하는 이유와 ImportError
가 일반적으로 발생하는 경우를 이해해 보겠습니다.
Python의 ImportError
는 코드 내의 import
문이 모듈을 성공적으로 가져오는 데 어려움이 있는 경우 발생합니다.
이러한 문제는 일반적으로 외부 라이브러리의 잘못된 설치 또는 가져오려는 모듈의 유효하지 않은 경로로 인해 발생합니다.
질문이 제기됩니다. ImportError: cannot import name (xyz)
가 언제 발생합니까? 이러한 종류의 ImportError
는 일반적으로 가져오려는 클래스가 순환 종속성에 있을 때 발생합니다.
그게 무슨 뜻이야? 순환 종속성이란 무엇입니까? 순환 종속성은 일반적으로 두 모듈이 서로 종속되도록 동시에 서로를 가져오려고 할 때 발생합니다.
이를 자세히 설명하려면 이 오류가 발생하는 방법과 시기를 이해하기 위한 예를 살펴봐야 합니다. demo1.py
및 demo2.py
라는 두 개의 모듈이 있다고 가정해 보겠습니다.
import
문으로 이동하기 전에 이러한 모듈의 내용을 살펴본 다음 import
문을 살펴보겠습니다.
보시다시피 demo2
모듈에는 demo2_func1()
및 demo2_func2()
라는 두 가지 기능이 있습니다. 마찬가지로 demo1
모듈에는 demo1_func1()
이라는 단일 함수가 있습니다.
보시다시피 demo2
모듈 내에서 demo1
모듈에서 demo1_func1
을 가져옵니다. 마찬가지로 demo1
모듈 내에서 demo2
모듈의 일부인 demo2_func2()
라는 함수를 가져오려고 합니다.
을 가져올 수 없습니다.
demo2
모듈에 초점을 맞추겠습니다.
demo2_func1()
함수가 일부 문자열을 인쇄한 다음 demo1
모듈에서 가져온 demo1_func1()
함수를 로드하는 것을 볼 수 있습니다. demo1_func1()
이 호출되면 일부 문자열을 인쇄합니다.
다음 줄에서 demo1_func1()
함수 내에서 demo2_func2()
메서드를 호출하므로 demo2_func2()
메서드도 demo1
모듈의 일부임을 알 수 있습니다. 이 두 모듈이 상호 의존적임을 알 수 있습니다.
이 경우 from demo1 import demo1_func1
및 from demo2 import demo2_func2
와 같은 문을 사용하면 순환 종속성이 발생합니다.
demo2
모듈을 실행하면 처음에는 demo2_func1()
이 호출되고 demo1_func1()
함수로 이동하므로 예상되는 출력은 다음과 같아야 합니다. 실행 후 ImportError
(cannot import name 'demo1_func1'
)가 표시됩니다.
ImportError: cannot import name 'demo1_func1' from partially initialized module 'demo1' (most likely
due to a circular import)
이는 주로 다른 모듈에서 한 모듈의 내용에 액세스하거나 그 반대로 액세스하려고 하기 때문에 발생합니다. demo2.py
모듈을 보면 demo1_func1
이 초기화되기 전에 demo1
에서 demo1_func1
함수를 가져오려고 합니다. 그 때 프로그램이 시작됩니다.
Python은 여전히 demo1
모듈의 내용을 초기화하고 있지만 demo1_func1
함수를 초기화할 충분한 시간을 Python에 제공하지 않습니다. 우리는 그것을 직접 호출하고 있기 때문에 이 ImportError
가 발생했습니다.
Python에서 ImportError: can import name
오류 수정
이제 이 오류를 수정하는 방법을 살펴보겠습니다. 두 가지 방법으로 이 오류를 수정할 수 있지만 가장 쉬운 방법을 사용합니다. 순환 종속성을 피하기 위해 Python이 자체적으로 수행할 수 있습니다.
문제를 해결하려면 특정 코드를 변경해야 합니다.
import
문을 수정해야 하며 모듈의 내용을 가져오는 대신 두 파일 모두에서 전체 모듈을 가져옵니다.
demo1.py
파일의 소스 코드:
import demo2
def demo1_func1():
print("demo1_func1")
demo2.demo2_func2()
demo2.py
파일의 코드:
import demo1
def demo2_func1():
print("demo2_func1")
demo1.demo1_func1()
def demo2_func2():
print("demo2_func2")
if __name__ == "__main__":
demo2_func1()
출력:
demo2_func1
demo1_func1
demo2_func2
대부분 이 오류는 청사진 접근 방식을 사용하여 Flask 앱을 개발할 때 발생하므로 Flask 구조를 생성하는 경우 이 링크를 따라야 할 수 있습니다.
Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.
LinkedIn관련 문장 - Python Error
- AttributeError 수정: Python에서 'generator' 객체에 'next' 속성이 없습니다.
- AttributeError 해결: 'list' 객체 속성 'append'는 읽기 전용입니다.
- AttributeError 해결: Python에서 'Nonetype' 객체에 'Group' 속성이 없습니다.
- AttributeError: 'Dict' 객체에 Python의 'Append' 속성이 없습니다.
- AttributeError: 'NoneType' 객체에 Python의 'Text' 속성이 없습니다.
- AttributeError: Int 객체에 속성이 없습니다.