파이썬의 상대적인 수입에 대해 설명할 수 있는 사람이 있습니까?
아무리 해도 파이썬의 상대적인 수입품을 작동시킬 수 없습니다.기능하지 않는 부분에 대한 간단한 예를 만들었습니다.
디렉토리 구조는 다음과 같습니다.
__init__.py
start.py
parent.py
sub/
__init__.py
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
저는 파이썬 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
이렇게 실행하면(PYONPATH가 비어 있는지 확인하기 위해):
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
만약 우리가 수입을 바꾼다면,sub/relative.py
- sub/relative.py
import parent
이렇게 실행하면 다음과 같습니다.
PYTHONPATH='' python3 start.py
출력:
Hello from parent.py
예 2:
.
├── 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
다음과 같이 실행:
PYTHONPATH='' python3 sub/start.py
출력:
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
만약 우리가 수입을 바꾼다면,sub/start.py
:
- sub/start.py
import relative
import parent
다음과 같이 실행:
PYTHONPATH='' python3 sub/start.py
출력:
Hello from relative.py
Traceback (most recent call last):
File "sub/start.py", line 3, in <module>
import parent
ModuleNotFoundError: No module named 'parent'
다음과 같이 실행:
PYTHONPATH='.' python3 sub/start.py
출력:
Hello from relative.py
Hello from parent.py
또한 루트 폴더에서 가져오기를 사용하는 것이 좋습니다. 예:
- sub/start.py
import sub.relative
import parent
다음과 같이 실행:
PYTHONPATH='.' python3 sub/start.py
출력:
Hello from relative.py
Hello from parent.py
언급URL : https://stackoverflow.com/questions/1918539/can-anyone-explain-pythons-relative-imports
'programing' 카테고리의 다른 글
이메일에서 내 파일에 계속 나타나는 ^M은 무엇입니까? (0) | 2023.06.30 |
---|---|
임의의 json 개체를 webapi에 게시하는 방법 (0) | 2023.06.30 |
파이썬의 IDLE 창을 지울 방법이 있습니까? (0) | 2023.06.25 |
Git: 새 원격 분기를 볼 수 없습니다. (0) | 2023.06.25 |
스프링 부트 테스트 - 테스트 속성을 찾을 수 없음 (0) | 2023.06.25 |