2010-07-13 2 views
1

동일한 디렉토리에있는 일련의 파이썬 모듈이 작성되었으며 ImportError에 문제가 있습니다.모듈을 '다시 가져 오기'할 때 왜 ImportError가 발생합니까?

내가 사용하는 세 개의 모듈은 draw_menu.py, errors.pyfile_operations.py입니다. 내가 오류 코드의 목록이 필요합니다 errors.py에서

, 나는 그러므로 나는 (클래스 정의 위) 단지 그녀 - 뱅 아래 import file_operations을 사용하고있는 코드가 포함 된 파일을 열 file_operations.py에 정의 된 사용자 정의 방법을 사용하고 있습니다.

file_operations.pyerror.py에 정의 된 방법을 사용하여 오류 (예 : 파일을 찾을 수 없음)가 발생할 때 오류 메시지를 인쇄합니다. 그러므로 나는 여기 같은 방식으로 import errors을 사용한다.

위의 작업은 정상적으로 작동하지만 draw_menu.py을 사용하여 ascii 메뉴의 옵션을 정의하는 파일을 사용하므로 (따라서 import file_operations) ImportError가 발생합니다. file_operations < - - errors <-file_operations

그것은 각 중요하다

draw_menu < : 당신이 좋아하는 경우 '수입 나무'흐름 때문에 다음과 같이

ImportError: cannot import name file_operations

나는이 것을 이해 모듈을 개별적으로 사용할 수있는 이유는 무엇입니까? import file_operationserrors.py에서 제거하지 않고이를 극복 할 수있는 방법은 무엇입니까? (예상대로)

감사합니다

답변

2

원형 수입은 파이썬에 문제가 발생할 수 있습니다. 그것은 확인 아마 가치가있는 경우 :

A) 그들은 모두 그들이 분리해야 할 서로에 너무 많이 의존하는 경우 errors.py 및 file_operation.py가 (단일 모듈이어야 함)

B) 당신이 할 수있는 하나 또는 다른 모듈에서 import을 지연 시키십시오. 함수의 import 문은 함수가 호출 될 때까지 실행되지 않으며 일반적으로 모듈 시작 부분에서 가져 오는 것이 좋지만 Python을 사용할 필요는 없습니다. 이와 같은 상황에서는 가져 오는 동안 순환 참조를 피할 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 두 모듈을 별도로 보관하고'errors.py'에 정의 된 필수 메서드 내에서'import file_operations'를 옮겼습니다.이 문제가 해결되었습니다. 일반적으로 순환 수입에서 어떤 종류의 문제가 발생합니까? – Thorsley

+0

@Thorsley : http://stackoverflow.com/questions/3082015/python-module-initialization-order/3082097#3082097 –

+0

http://effbot.org/zone/에서 파이썬으로 가져 오기에 대한 오래된 좋은 기사가 있습니다. import-confusion.htm을 참조하십시오. 읽는 가치가 있습니다. – mavnn

1

문제는 가져 오기 자체가 아니지만 종속성입니다. file_operationserrors을 가져올 때까지 처리 할 수 ​​없지만 을 가져올 때까지 errors을 처리 할 수 ​​없습니다. 파이썬은 이것을 이것을 불가능한 상황으로 인식하고 오류를 발생시킵니다.

이 최적의 솔루션은 더 이상이 순환 종속성이 없도록 파일을 리팩터링하는 것입니다. 이것이 실제로 불가능한 경우 대안 솔루션은 모듈 중 하나를 변경하여 문제가되는 함수가 최상위 수준이 아닌 함수 내에서 발생하도록하는 것입니다. 즉, 모듈의 초기 처리는 가져 오기에 종속되지 않으므로 성공합니다.

+0

이것은 올바르지 않습니다. 가져 오기 프로세스가 충분히 정의 될 때까지 다른 모듈의 참조를 사용할 수 없습니다. 그러나 단순히 모듈을 가져 오면 문제가되지 않습니다. –

0

순환 종속성을 해제하는 것 외에도 가져 오기 호출 위치를 옮겨 볼 수 있습니다. 파이썬에서의 import는 단지 일반적인 문장 일 뿐이므로, 예를 들어 내부 함수를 import 할 수 있다는 것을 잊지 마십시오.

문제는 가져 오기 (부작용)가 실제로 가져올 모듈 (가져 오기를 처음 호출 할 때)을 실행한다는 것입니다. 따라서 원래 모듈을 가져 오는 모듈을 가져 오는 경우 혼란스러워집니다.

error/file_operations를 실제로 사용해야하는 지점에서만 가져 와서 문제를 완화 할 수 있습니다. 이것은 함수 내부에있을 수 있습니다. 그래서 어쩌면 오류가있는 함수를 호출 할 수 있습니다.

이렇게하면 일반 가져 오기를 실행 한 후에 만 ​​오류를 가져올 수 있습니다.

+0

아니면 상단에있는'import errors'를 사용하고 함수 내에서'errors.print_error_message'를 사용할 수 있습니다. –

관련 문제