2017-04-16 4 views
2

이 질문은 python 2.7 및 관련 가져 오기의 맥락에 있습니다. 나는 관련 질문을 겪었는데, 상황은 여전히 ​​나를 위해 일하지 않습니다. 내가 뭘 놓치고 있는지 모르겠다. 다음형제 디렉토리에서 가져 오기와 관련한 문제

내 디렉토리 계층 구조

. 
|-> wrapper.py 
|-> __init__.py 
|-> util 
| |-> hello.py 
| |-> __init__.py 
|-> src 
| |-> wrapper.py 
| |-> __init__.py 

모든 __init__.py 빈 파일은 ./util/hello.py 읽기 어떻게 다음

"를 포함하는 패키지와 같은 디렉토리를 치료"에 있습니다 . 이것은 자체의 주요 기능을 가지고 있으며 자체적으로 실행할 수 있습니다.

다음은 ./wrapper.py가 읽는 방법입니다. 이것은 또한 자체적 인 주요 기능을 가지고 있으며 목적을 달성하기 위해 ./util/hello.py를 사용합니다.

#!/usr/bin/python 
# This is wrapper.py. 

import sys 
from util import hello 

# Define a main() function that prints a little greeting. 
def main(): 
    hello.main()  # This prints "Hello World!!!" 

# Standard boilerplate that calls the main() function. 
if __name__ == '__main__': 
    main() 

다음은 ./src/wrapper.py에서 읽는 방법입니다.

#!/usr/bin/python 
# This is wrapper.py. 

import sys 
from ..util import hello 

# Define a main() function that prints a little greeting. 
def main(): 
    hello.main()  # This prints "Hello World!!!" 

# Standard boilerplate that calls the main() function. 
if __name__ == '__main__': 
    main() 

위와 같이 거의 변화가없는 ./wrapper.py와 거의 동일한 사본으로 변경 사항을 적용합니다 (가져 오기 변경). 모두 __init__.py도 있습니다. 그러나이를 실행하려고 시도하면 다음과 같은 오류가 발생합니다. 나는 다음과 같은 hello.py를 가져 오는 경우

Traceback (most recent call last): 
    File "wrapper.py", line 8, in <module> 
    from ..util import hello 
ValueError: Attempted relative import in non-package 

그러나, 그것은 작동합니다

import os 
sys.path.append(os.path.abspath("../util/")) 
import hello 

두 질문 :

Q1을. 내가 뭘 잘못하고 있거나 내 관심을 잃어버린거야?

2. ./src/__init__.py을 코딩하면 ./src/wrapper.py에서 "import hello"가 작동합니다.

+0

? 관련 - https://stackoverflow.com/questions/11536764/how-to-fix-attempted-relative-import-in-non-package-even-with-init-py –

+0

Q1을 다루는 많은 기존 답변이 있습니다. "비 패키지에서 상대 가져 오기 시도"를 검색하십시오. 나는 질문이 잘못된 방향으로 인도하기 때문에 Q2에 대답 할 수 없다. 당신은'python -m src.wrapper'를 실행할 수 있습니다. 그렇다면'from hello import hello'도'src/wrapper.py'에서 작동합니다. 일반적으로 최상위 레벨이 아닌 위치에서 상대적인 수입을 피하는 것이 현명하다고 생각합니다! – mhoff

+0

@AshishNitinPatil : "./src"에서 "python wrapper.py"로 실행 중입니다. –

답변

1

간단한 대답은 모든 코드에 대해 상위 패키지가 있어야한다는 것입니다. __init__.py을 루트 디렉토리에 넣고 패키지로 작동 할 것으로 기대할 수는 없습니다.

I로 시작, 좋고 나쁜에 옵션을 나눌 수 있습니다 나쁜 :

나쁜 - 상대 수입 : 당신이 무엇을해야 패키지에 모든 코드 (일명 .)를 넣어 적절하게 이름 지어 짐 (src은 패키지 btw의 나쁜 이름 임).라고 말하십시오. 그런 다음 src.wrappermypackage.src.wrapper으로 가져올 수 있습니다. 에 열려있는 파이썬 인터프리터가mypackage을 포함하는 Python 경로에서 사용할 수있는 곳에서 가져올 수 있습니다. 패키지를 설치하면 경로에서도 사용할 수 있습니다.보다 상대적으로 수입 정보와 이유를 들어

그들은 나쁜 :

좋은 - 비 상대 수입 :가 더 나은 접근법은 통해 수입입니다 패키지를 절대적으로 사용합니다. 여전히 부모 패키지 mypackage을 만들어야하지만 이번에는 상대 수입을 없애고 에서 import mypackage.util.hellowrapper.py 안에 사용하십시오. 이 작업을하려면 mypackage을 포함하는 디렉토리를 포함하도록 python 경로를 설정해야합니다.

setup.py 파일을 만들고 패키지를 설치하는 것이 좋습니다. 개발을위한 파이썬 포장에 python setup.py develop 또는 pip install -e .

이상을 사용한다 : https://packaging.python.org/distributing/

편집 : 당신의 Q2를 들어, 당신은 절대 수입을 사용하는 경우가 import mypackage.util.hello as hello 또는 from mypackage.util import hello를 사용할 수 있습니다. 둘 다 동일합니다. 특별한 경우

당신은 /mypackage/__init__.py 내부 import util.hello as hello를 작성에 관심이있을 수 있습니다, 그리고 당신은 사용할 수 from mypackage import hello 등 당신은 어떻게`./wrapper.py`을 실행하는

관련 문제