2012-12-01 5 views
1

헤더가 이해하기 어려울 수도 있지만 가능한 한 설명하려고 노력할 것입니다. __init__.py 내부, 나는이있어파이썬 가져 오기 : 모듈의 경로는 가져온 위치에 따라 다릅니다.

__init__.py 
Class1.py 
Class2.py 

:

나는 3 개 총 파일 포함 SubModule라는 폴더가

import Class1 
import Class2 

def main(): 
    c1 = Class1.Class1() 
    c2 = Class2.Class2() 

if __name__ == "__main__": 
    main() 

를 그리고 모두가 오류없이 잘 작동, 내가 할 수있는 c1과 c2를 올바르게 사용하십시오. 내가 다른 모듈의 아래 SubModule 폴더를 이동하려고 할 때


문제가 나타납니다 폴더 (의이 MainModule를 부르 자). 그래서 나는 다음있을 것입니다 :

MainModule\__init__.py 
MainModule\SubModule\__init__.py 
MainModule\SubModule\Class1.py 
MainModule\SubModule\Class2.py 

을 지금은과 같이 MainModule\__init__.py에서 SubModule을 가져올 때 :

import SubModule 
c1 = SubModule.ClassOne.ClassOne() 
c2 = SubModule.ClassTwo.ClassTwo() 

내가이 일을 기대. 당신이 볼 수 있듯이, 오류가 import Class1에서 오는

Traceback (most recent call last): 
    File "C:\...\MainModule\__init__.py", line 1, in <module> 
    import SubModule 
    File "C:\...\MainModule\SubModule\__init__.py", line 1, in <module> 
    import Class1 
ImportError: No module named 'Class1' 

, 그리고 No module named 'Class1'가 있다는 것을 저에게 말한다 : 그러나, MainModule\__init__.py을 실행하는 SubModule\__init__.py에서 오류가 발생합니다. 경로가 SubModule.Class1 인 경우에만 Class1 대신이 경로가 사용됩니다. 나는이에 SubModule\__init__.py을 변경하여이 오류를 제거 할 수 있습니다 : 경로가 다시 import Class1 것 때문에

import SubModule.Class1 
import SubModule.Class2 

그러나, 나는 더 이상 대신 import SubModule.Class1의, SubModule\__init__.py을 실행하여 혼자 SubModule을 사용할 수 없습니다.

이것은 나를 미치게합니다. 수입을 일반화 할 수있는 방법이 있습니까? 그렇다면 어떤 모듈이 SubModule을 가져 오는지는 중요하지 않습니까?

+0

이것은 가져 오기를하는 이상한 방법입니다. SubModule을 한 곳에 넣고 시스템 경로에 추가하고 항상 거기에서 가져 오지 않는 이유는 무엇입니까? – BrenBarn

답변

1

당신은 항상 시스템 경로에서 절대적으로 모듈을 가져와야합니다

try: 
    import Submodule.Class1 as Class1 
except ImportError: 
    import Class1 
+0

누군가가 더 나은 것을 생각해 내면 아직 받아 들일 수 없지만, 지금은 할 것입니다. 나는 이미 비슷한 것을 가지고 있었지만, 'Class1'팁에 대해 감사 드리며, 그 것을 알지 못했다. –

0

...이 정확히 '일반'이 아니라 방법,하지만. 따라서 패키지 MainModule에 하위 패키지 SubModule이 포함되어있는 경우 from MainModule import SubModule (또는 from . import SubModule)을 수행해야합니다. 또한 SubModule 내부에서 from . import Class1을 수행하십시오. 이렇게하면 SubModule 경로에 관계없이 작동합니다. (그러나 두 가지 다른 방법으로 SubModule을 가져 오는 경우에도 이상하게 느껴질 수 있습니다.

+0

소리가 다소 들리지만, 지금은 시험 할 수 없지만 집에 올 때가됩니다. –

+0

'MainModule '에서'MainModule ...'을 가져올 수 없습니다.'No Module 'MainModule' –

관련 문제