2011-11-16 5 views
5

내가 다음과 같습니다 프로젝트가 실패파이썬 절대 가져 오기

my_project/ 
      __init__.py -- empty 
      run.py 
      datacheck/ 
        __init__.py -- empty 
        datacheck.py -- containing class DataCheck(object) 
        config.py -- containing BusinessConfig(object) 
        business.py -- containing class BusinessCheck(DataCheck) 

PYTHONPATH 그 안에/my_project을 갖도록 구성된다.

run.py, 나는 다음과 같은 코드가 있습니다 :

from datacheck.business import BusinessCheck 
business = BusinessCheck() 
business.check_data() 

business.py, 나는 실패 다음과 같은 수입이 있습니다

from datacheck.config import BusinessConfig 
from datacheck.datacheck import DataCheck 

from .config import BusinessConfig 작품 같은 상대적으로 수입 - 그러나 나는 많은 스레드에서 절대적인 import가 선호된다고 읽었다. 이 실패하지 않았다,

myproject/ 
      __init__.py -- empty 
      run_test.py 
      test/ 
       __init__.py -- empty 
       test1.py -- containing class Test1(object) 
       test2.py -- containing class Test2(Test1) 

run_test.py 수입과 Test2 클래스를 실행합니다

간단한 테스트를 위해, 나는 또한 다음 만들었습니다.

그것은 나에게 약간의 깜짝 놀라움을 남겨줬고, 나는 왜 datacheck의 절대 수입이 작동하지 않는지 이해하지 못한다.

+0

'from datacheck.business import Business' 그러나'business.py - 클래스를 포함하는 BusinessCheck (DataCheck)'... 클래스'Business'는 어디에 있습니까? – eumiro

+0

'datacheck '에'__init __. py' 파일이 있습니까? 이 파일은 디렉토리를 패키지로 만들고 비울 수 있습니다. –

+0

@eumiro : 죄송합니다. 약간의 실수를 수정하십시오. –

답변

6

documentation에서 설명한대로 모듈을 __main__으로 사용할 수있는 경우 절대 가져 오기를 선호해야합니다. 그렇지 않다면 상대적인 수입은 괜찮습니다.

datacheck 패키지에 datacheck (동일한 이름) 패키지가 있기 때문에 이러한 가져 오기에 실패합니다. 이름을 찾을 때, Python은 암시 적으로 패키지 내부를 먼저 찾습니다. 여기서 모듈 datacheck을 찾습니다. 그러나이 모듈에는 이름이 config 인 항목이 없으므로 가져 오기가 실패합니다.

절대 가져 오기를 사용하려면 모듈의 datacheck에서 모든 내용을 패키지의 __init__.py으로 옮기거나 이름을 바꿉니다.

+0

그 (datacheck의 datacheck) 다 함께, 나는 이것이 불가능하다는 것을 알지 못했습니다! 고마워요 :-) –

+0

@SjaakTrekhaak : 가능 합니다만 모호한 부분이 있으므로 신중해야합니다. –

2

나는이 나중에 몇 년 알지만, 여기에 검색 다른 사람의 이익을 위해, 나는 코드의이 비트와 비슷한 문제를 해결할 수 있었다 : 그 후

from __future__ import absolute_import 

, 절대 수입에 괜찮 았는데 파이썬 2.6 및 2.7.