모듈 __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
'sourcetip' 카테고리의 다른 글
CSS 클래스를 <%=f.cisco %>에 추가합니다. (0) | 2023.08.06 |
---|---|
인덱스 rowid BATCHED에 의한 테이블 액세스와 인덱스 rowid에 의한 테이블 액세스 간의 차이 (0) | 2023.08.06 |
Spring boot에서 "ConditionalOnProperty is exclusive"를 어떻게 수정합니까? (0) | 2023.08.06 |
AJAX 요청 후 위쪽으로 스크롤 중지 (0) | 2023.08.01 |
선형 레이아웃에서 단추 가운데 맞춤 (0) | 2023.08.01 |