누구나 파이썬의 상대적 수입을 설명 할 수 있습니까?
나는 내 인생에서 파이썬의 상대적 수입품을 얻을 수 없다. 작동하지 않는 간단한 예를 만들었습니다.
디렉토리 구조는 다음과 같습니다.
/__init__.py
/start.py
/parent.py
/sub/__init__.py
/sub/relative.py
/start.py
단지 포함 : import sub.relative
/sub/relative.py
그냥 포함 from .. import parent
다른 모든 파일은 비어 있습니다.
명령 행에서 다음을 실행할 때 :
$ cd /
$ python start.py
나는 얻다:
Traceback (most recent call last):
File "start.py", line 1, in <module>
import sub.relative
File "/home/cvondrick/sandbox/sub/relative.py", line 1, in <module>
from .. import parent
ValueError: Attempted relative import beyond toplevel package
Python 2.6을 사용하고 있습니다. 왜 이런 경우입니까? 이 샌드 박스 예제를 어떻게 작동하게합니까?
"sub"패키지에서 가져오고 있습니다. 선물 start.py
이 있어도 패키지 자체가 아닙니다 __init__.py
.
하나의 디렉토리에서 프로그램을 시작해야합니다 parent.py
.
./start.py
./pkg/__init__.py
./pkg/parent.py
./pkg/sub/__init__.py
./pkg/sub/relative.py
로 start.py
:
import pkg.sub.relative
이제 pkg가 최상위 패키지이며 상대 가져 오기가 작동합니다.
현재 레이아웃을 고수하려면을 사용하면 import parent
됩니다. start.py
인터프리터를 시작 하는 데 사용 하기 때문에 start.py
위치가 있는 디렉토리 는 파이썬 경로에 있습니다. parent.py
별도의 모듈로 존재합니다.
__init__.py
디렉토리 트리 위로 스크립트를 가져 오지 않으면 최상위 레벨을 안전하게 삭제할 수도 있습니다 .
relative.py
직접 호출 하려는 경우, 즉 최상위 모듈에서 실제로 가져 오려면 명시 적으로 sys.path
목록에 추가해야 합니다.
작동 방식은 다음과 같습니다.
# Add this line to the beginning of relative.py file
import sys
sys.path.append('..')
# Now you can do imports from one directory top cause it is in the sys.path
import parent
# And even like this:
from parent import Parent
위의 내용으로 인해 불일치가 발생할 수 있다고 생각되면 대신 사용할 수 있습니다.
sys.path.append(sys.path[0] + "/..")
sys.path[0]
진입 점이 실행 된 경로를 나타냅니다.
python3에서 확인하기 :
python -V
Python 3.6.5
예 1 :
.
├── parent.py
├── start.py
└── sub
└── relative.py
- start.py
import sub.relative
- parent.py
print('Hello from parent.py')
- sub/relative.py
from .. import parent
우리가 이것을 이렇게 실행하면 (PYTHONPATH가 비어 있는지 확인하십시오) :
PYTHONPATH='' python3 start.py
산출:
Traceback (most recent call last):
File "start.py", line 1, in <module>
import sub.relative
File "/python-import-examples/so-example-v1/sub/relative.py", line 1, in <module>
from .. import parent
ValueError: attempted relative import beyond top-level package
If we change import in sub/relative.py
- sub/relative.py
import parent
If we run it like this:
PYTHONPATH='' python3 start.py
Output:
Hello from parent.py
Example2:
.
├── parent.py
└── sub
├── relative.py
└── start.py
- parent.py
print('Hello from parent.py')
- sub/relative.py
print('Hello from relative.py')
- sub/start.py
import relative
from .. import parent
Run it like:
PYTHONPATH='' python3 sub/start.py
Output:
Hello from relative.py
Traceback (most recent call last):
File "sub/start.py", line 2, in <module>
from .. import parent
ValueError: attempted relative import beyond top-level package
If we change import in sub/start.py
:
- sub/start.py
import relative
import parent
Run it like:
PYTHONPATH='' python3 sub/start.py
Output:
Hello from relative.py
Traceback (most recent call last):
File "sub/start.py", line 3, in <module>
import parent
ModuleNotFoundError: No module named 'parent'
Run it like:
PYTHONPATH='.' python3 sub/start.py
Output:
Hello from relative.py
Hello from parent.py
Also it's better to use import from root folder, i.e.:
- sub/start.py
import sub.relative
import parent
Run it like:
PYTHONPATH='.' python3 sub/start.py
Output:
Hello from relative.py
Hello from parent.py
참고URL : https://stackoverflow.com/questions/1918539/can-anyone-explain-pythons-relative-imports
'Programing' 카테고리의 다른 글
태깅을위한 데이터베이스 디자인 (0) | 2020.05.31 |
---|---|
MS Excel 버전 관리를 수행하는 가장 좋은 방법 (0) | 2020.05.31 |
현재 상태와 일치하도록 AJAX 앱의 주소 표시 줄 URL 수정 (0) | 2020.05.31 |
Gradle 빌드 스크립트 종속성 (0) | 2020.05.31 |
“#pragma comment”는 무엇을 의미합니까? (0) | 2020.05.31 |