sourcetip

모듈 __file__ 특성이 절대적입니까, 상대적입니까?

fileupload 2023. 8. 6. 10:16
반응형

모듈 __file__ 특성이 절대적입니까, 상대적입니까?

이해하는데 어려움을 겪고 있습니다.__file__제가 알기로는__file__모듈이 로드된 절대 경로를 반환합니다.

생산하는 데 문제가 있습니다.나는 있습니다abc.py 마디로print __file__에서 는치망도▁from는에서./d/projects/ python abc.py아온다를 합니다.abc.py에서 는치망도▁from는에서./d/아온다를 합니다.projects/abc.py이유가 있습니까?

설명서에서 다음을 참조하십시오.

__file__모듈이 파일에서 로드된 경우 모듈이 로드된 파일의 경로 이름입니다.__file__특성은 인터프리터에 정적으로 연결된 C 모듈에는 없습니다. 공유 라이브러리에서 동적으로 로드된 확장 모듈의 경우 공유 라이브러리 파일의 경로 이름입니다.

@kindall이 댓글로 연결한 메일링 목록 스레드에서 다음 질문에 답합니다.

이 예제를 다시 사용하려고 시도하지는 않았지만, 그 이유는 모든 가져오기에서 getpwd()를 호출할 필요도 없고 현재 디렉터리를 캐시하기 위해 진행 중인 변수의 일종도 원하지 않기 때문입니다.(getpwd는 상대적으로 느리고 때로는 완전히 실패할 수 있으며, 캐시를 시도하는 것이 틀릴 수 있는 확실한 위험이 있습니다.)

대신 우리가 하는 일은 현장에서의 코드입니다.py는 sys.path의 요소들을 걸어서 절대 경로로 바꿉니다.그러나 이 코드는 sys.path 앞에 "가 삽입되기 전에 실행되므로 sys.path의 초기 값은 '입니다.

나머지는 다음과 같습니다.sys.path 포함하지 ''.

그래서, 만약 당신이 그 부분 밖에 있다면.sys.path모듈을 포함하고 있으면 절대 경로를 얻을 수 있습니다.의 내부에 있는 경우sys.path모듈이 포함되어 있으면 상대 경로를 얻을 수 있습니다.

현재 디렉터리에 모듈을 로드하고 현재 디렉터리가 다음 위치에 없는 경우sys.path당신은 절대적인 길을 얻게 될 것입니다.

현재 디렉토리에 모듈을 로드하고 현재 디렉토리가sys.path상대적인 경로를 얻게 될 것입니다.

__file__상대 경로를 사용하여 스크립트를 직접 실행하는 경우를 제외하고는 Python 3.4 이후로는 절대적입니다.

»__file__관련 값)은. 단, " " (으)ㄹ 수 있습니다."는 입니다.__main__.__file__스크립트가 상대 경로를 사용하여 직접 실행된 경우. (bpo-18416에서 Brett Cannon에 의해 기여)

하지만 심볼릭 링크가 해결되는지는 잘 모르겠습니다.

상대 경로 전달 예제:

$ python script.py

간단한 후기 예:

from os import path, getcwd, chdir

def print_my_path():
    print('cwd:     {}'.format(getcwd()))
    print('__file__:{}'.format(__file__))
    print('abspath: {}'.format(path.abspath(__file__)))

print_my_path()

chdir('..')

print_my_path()

에서는 두 이 Python-2를 합니다.*에서는 두 번째 호출이 다음을 잘못 결정합니다.path.abspath(__file__)현재 디렉터리 기준:

cwd:     C:\codes\py
__file__:cwd_mayhem.py
abspath: C:\codes\py\cwd_mayhem.py
cwd:     C:\codes
__file__:cwd_mayhem.py
abspath: C:\codes\cwd_mayhem.py

@techtonik이 지적했듯이, Python 3.4+에서, 이것은 다음과 같이 잘 작동할 것입니다.__file__절대 경로를 반환합니다.

@ @의 각 멤버에서 모듈을 표준 할 수 .sys.path이 검색 결과 파일(PyMOTW 모듈 및 가져오기에 대한 자세한 내용).따라서 모듈이 절대 경로에 있는 경우sys.path결과는 절대적이지만, 만약 그것이 상대적인 경로에 위치한다면.sys.path결과는 상대적입니다.

이제더더.site.py ▁in▁▁startuping다로 절대 경로만 하는 것을 담당합니다.sys.path첫머리를 제외하고''하는 것 (이절대 경로로 되며, 앞에 PYTHONPATH가 붙습니다.)sys.path), 는 항상 경로가 디렉터리를 액세스할 때는 절대 경로가

이제 재미있는 방법으로 sys.path를 속이면 무엇이든 얻을 수 있습니다.

를 들어 샘플 이 있는 foo.py/tmp/다음 코드로:

import sys
print(sys.path)
print (__file__)

/tmp를 입력하면 다음과 같이 표시됩니다.

>>> import foo
['', '/tmp', '/usr/lib/python3.3', ...]
./foo.py

에 있을 때/home/user/tmp당신의.PYTHONPATH다음과 같은 정보를 얻을 수 있는 것:

>>> import foo
['', '/tmp', '/usr/lib/python3.3', ...]
/tmp/foo.py

를 해도.../../tmp정규화될 것이고 결과는 동일합니다.

하지만 사용하는 대신에PYTHONPATH당신은 직접적으로 재미있는 경로를 사용하여 원인만큼 재미있는 결과를 얻습니다.

>>> import sys
>>> sys.path.append('../../tmp')
>>> import foo
['', '/usr/lib/python3.3', .... , '../../tmp']
../../tmp/foo.py

Guido는 위의 인용된 스레드에서 python이 절대 경로의 모든 항목을 변환하지 않는 이유를 설명합니다.

모든 가져오기에 대해 getpwd를 호출할 필요가 없습니다. ..getpwd는 상대적으로 느리고 때로는 완전히 실패할 수 있습니다.

그래서 당신의 길은 그대로 사용됩니다.

__file__사용되는 python 버전과 모듈이 직접 실행되는지 여부에 따라 상대적이거나 절대적일 수 있습니다.

TL;DR:

  • 파이썬 3.5에서 3.8로__file__는 모듈이 직접 호출되는 경우 현재 작업 디렉터리와 함께 모듈의 상대 경로로 설정됩니다.그렇지 않으면 절대 경로로 설정됩니다.
  • 파이썬 3.9 이후로__file__는 해당 모듈이 직접 실행되는 경우에도 절대 경로로 설정됩니다.

예를 들어, 다음과 같은 설정( 답변에서 영감을 얻음):

# x.py:
from pathlib import Path
import y
print(__file__)
print(Path(__file__))
print(Path(__file__).resolve())
# y.py:
from pathlib import Path
print(__file__)
print(Path(__file__))

와 함께x.py그리고.y.py같은 디렉토리에 있습니다.하여 다음을실행한 :

python x.py

다음과 같습니다.

Python 3.5 - 3.8:

D:\py_tests\y.py
D:\py_tests\y.py
x.py
x.py
D:\py_tests\x.py

파이썬 3.9 - 3.11

D:\py_tests\y.py
D:\py_tests\y.py
D:\py_tests\x.py
D:\py_tests\x.py
D:\py_tests\x.py

언급URL : https://stackoverflow.com/questions/7116889/is-module-file-attribute-absolute-or-relative

반응형