programing

파이썬의 상대적인 수입에 대해 설명할 수 있는 사람이 있습니까?

goodsources 2023. 6. 25. 18:47
반응형

파이썬의 상대적인 수입에 대해 설명할 수 있는 사람이 있습니까?

아무리 해도 파이썬의 상대적인 수입품을 작동시킬 수 없습니다.기능하지 않는 부분에 대한 간단한 예를 만들었습니다.

디렉토리 구조는 다음과 같습니다.

__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

반응형