2014-01-23 2 views
0

파이썬 모듈을 다른 파이썬 모듈에 사용하는 데 문제가 있습니다. 사용 사례는 다음과 같습니다.파이썬 모듈 사용

다음 시나리오를 고려하십시오. 오류는 그에 따라 주석 처리되었습니다. 파일 A.py에서

:

... 
... 

어떤 아이디어 : 파일 C.py에서

import C 
import A 

c_func = C.func1() # works perfectly 
a_func = A.func2() # Error: 'module' object has no attribute 'func2' 

... 
... 

:

파일 B.py에서
import B 

... 
... 

? 미리 감사드립니다.

+1

은'func2'를 정의하는 A.py의 코드를 보여줍니다 ... – mhlester

답변

6

이것은 순환 가져 오기입니다. 일반적으로 작동하지 않습니다.

FAQ에 대한 설명 및 그에 대한 해결 방법은 How can I have modules that mutually import each other?을 참조하십시오. Fredrik Lundh의 effbot 사이트에도 Circular Imports 섹션이 있습니다. 그러나 간단히 :

  • A 실행을 시작합니다.
  • Aimport B에 도달합니다.
  • B 실행을 시작합니다.
  • Bimport A에 도달합니다. A이 이미 있으므로이 작업은 수행되지 않습니다. A의 코드가 아직 실행되지 않았습니다. A.func2에 대한 정의가 실행되지 않았습니다.
  • B 아직 정의되지 않은 A.func2을 사용하려고하므로 오류가 발생합니다.

(훨씬 더 간단하게,하지만 덜 정확하게 :. BBB이 실행될 때까지 실행되지 않을 수 있음을 의미 B에 의존하는, A에 따라이는 할 수있다, 당신은 문제의 직관적 인 이해를 얻을 도움이 될 수 있습니다 위의 더 완전한/정확한 설명을 이해하는 데 도움이.)

은 당신이 아마하고 싶은에 필요하지 않습니다 모두 AB 가져올 수있는 별도의 모듈로 AB 그 요구에 코드를 이동하다 A 또는 B을 가져 오십시오. 그게 가능한 해결책 (두 가지 다른 아이디어에 대한 FAQ 항목 참조)이 아니지만, 이것을 깔끔하게 할 수있을 때, 그것을 이길 수 있습니다. (실제 코드가 없으면 그보다 더 구체적인 대답을내는 것이 어렵습니다.)

+0

그러나 함수가 호출되는 한 * 작동 할 수 있습니다 수입이 끝난 후에 말이야, 그렇지? – mhlester

+0

@mhlester : 예. FAQ에서 제시 할 수있는 해결책 중 하나는'B'의 최상위 코드를 모두 함수로 옮기고 함수가 필요로하는 모든 것을 정의한 후에 만 ​​함수를 호출하는 것입니다. 또 다른 가능한 해결책은 func2가 정의 될 때까지'import B '를'A'에서 더 멀리 아래로 이동하는 것입니다. – abarnert

+0

@abarnert : 설명에 감사드립니다. 알았어 .. –