2016-10-06 1 views
2

이 구조는 단지 일례여러 상대 수입 3.5

pkg\ 
    test\ 
    __init__.py 
    test.py 
    __init__.py 
    source.py 
    another_source.py 

another_source.py

class Bar(): 
    def __init__(self): 
    self.name = "bar" 

source.py

from another_source import Bar 
class Foo(): 
    def __init__(self): 
    self.name = "foo" 
    b = Bar() 

test.py

from ..source import Foo 

if __name__== "__main__": 
    f = Foo() 
    print(f.name) 

이제 test.py를 실행하고 싶습니다. 그것이 answer으로 받아 들여 한 바와 같이 나는 나의 현재 패키지 위에 가서

python -m pkg.test.test 

를 실행해야하지만이 작동하지 않고 파이썬은 나에게 나는 모든 another_source을 제거하면 역 추적

Traceback (most recent call last): 
    File "-\Python35\lib\runpy.py", line 170, in _run_module_as_main 
    "__main__", mod_spec) 
    File "-\Python35\lib\runpy.py", line 85, in _run_code 
    exec(code, run_globals) 
    File "~\test\test.py", line 1, in <module> 
    from ..source import Foo 
    File "~\source.py", line 1, in <module> 
    from another_source import Bar 
ImportError: No module named 'another_source' 

을 제공합니다 - 그것이 작동하지만, 그것은 해결책이 아닙니다.

이제는 저 위에 하나의 디렉토리에있는 장소에서 수업을 가져 오는 정상적인 방법이 있습니까?

+1

'from pkg.source import Foo'가 필요합니다. –

답변

1

pkg.source은 마치 최상위 수준 인 것처럼 pkg.another_source 모듈에서 항목을 가져 오려고합니다. 가져 오기를 수정해야합니다. 올바르게 기억하면

+0

하지만 내 메인 스크립트 가져 오기 (source.py와 같은 디렉토리)는 실패합니다. – Nozdrum

+0

@Nozdrum : 그러면이 프로그램을 실행할 때 패키지 계층 구조가 시작되는 위치가 일관성이 없습니다. 그것들을'pkg' 디렉토리에서'python -m pkg.whatever'로 실행하거나, 여기에서 설명하기에는 너무 많은'__package__'와'sys.path'를 수정하기 위해 약간의 보일러 판을 넣어야합니다 (하지만 [PEP 366] (https://www.python.org/dev/peps/pep-0366/)을 읽는 것이 좋습니다). – user2357112

+0

내 test.py를 실행하는 것과 같은 방식으로 main.py를 실행하면 작동합니다. 그러나 그것이 작동하는 이유에 관해서는 정말로 나에게 어떤 의미가 없습니다. -m 스위치는 "라이브러리 모듈을 스크립트로 실행"한다고 말했지만 라이브러리 모듈을 실행하지는 않습니다. test.py가 라이브러리가 아니라 테스트 케이스 인 것처럼 "main"스크립트를 실행하고 있습니다. – Nozdrum