__file__ 변수는 무엇을 의미합니까?


177
A = os.path.join(os.path.dirname(__file__), '..')

B = os.path.dirname(os.path.realpath(__file__))

C = os.path.abspath(os.path.dirname(__file__))

나는 보통 이것을 실제 경로로 고정 배선합니다. 그러나 런타임에 경로를 결정하는이 문에 대한 이유가 있으며 os.path 모듈을 실제로 사용하고 싶습니다.

답변:


162

파이썬에서 파일에서 모듈을로드 __file__하면 해당 경로로 설정됩니다. 그런 다음 다른 기능과 함께 사용하여 파일이있는 디렉토리를 찾을 수 있습니다.

한 번에 하나씩 예를 들면 :

A = os.path.join(os.path.dirname(__file__), '..')
# A is the parent directory of the directory where program resides.

B = os.path.dirname(os.path.realpath(__file__))
# B is the canonicalised (?) directory where the program resides.

C = os.path.abspath(os.path.dirname(__file__))
# C is the absolute path of the directory where the program resides.

여기에서 반환 된 다양한 값을 볼 수 있습니다.

import os
print(__file__)
print(os.path.join(os.path.dirname(__file__), '..'))
print(os.path.dirname(os.path.realpath(__file__)))
print(os.path.abspath(os.path.dirname(__file__)))

당신이 (예 : 다른 위치에서 실행해야합니다 ./text.py, ~/python/text.py어떤 차이를 만드는을 볼 수 등 등).


7
좋은 답변이지만 다른 답변에서 다른 중요한 세부 사항을 참조하십시오 __file__. 정적으로 연결된 C 모듈과 같은 모든 경우에 정의되지는 않습니다. 우리는 __file__항상 사용할 수 있다고 생각할 수 없습니다.
Chris Johnson

5
인터프리터에서 모든 예제는을 반환 name '__file__' is not defined합니다.
user1063287

10
@ user1063287 DemoUser의 답변을보십시오. __file__파일에서로드 된 경우 모듈이로드 된 파일의 경로 이름입니다. 이 방법은 __file__당신이하지 인터프리터 스크립트로 실행할 경우에만 작동합니다 (당신이 인터프리터 가져올하지 않는 한 ...).
YOUNG

59

먼저 혼란을 해결하고 싶습니다. __file__와일드 카드가 아닌 속성입니다. 이중 밑줄 속성 및 방법은 규칙에 따라 "특별한"것으로 간주되며 특수한 용도로 사용됩니다.

http://docs.python.org/reference/datamodel.html 은 많은 특수 메소드 및 속성을 보여줍니다 (모두는 아님).

이 경우 __file__모듈 (모듈 객체)의 속성입니다. 파이썬에서 .py파일은 모듈입니다. 따라서 상황에 따라 다른 것을 의미 import amodule하는 속성이 __file__있습니다.

문서에서 가져온 것 :

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

귀하의 경우 모듈이 __file__전역 네임 스페이스 의 자체 속성에 액세스하고 있습니다.

이것을 실제로 보려면 다음을 시도하십시오.

# file: test.py

print globals()
print __file__

그리고 다음을 실행하십시오.

python test.py

{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__file__':
 'test_print__file__.py', '__doc__': None, '__package__': None}
test_print__file__.py

23

문서 :

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

그리고 또한 :

__file__모듈이 내장되어 (및에 나열 sys.builtin_module_names되어있는 경우) 속성이 설정되지 않은 경우 파일에 대한 "경로" 가됩니다.


13

__file__다양한 os.path모듈 과 결합 하여 사용 하면 모든 경로가 현재 모듈의 디렉토리 위치에 상대적이됩니다. 이를 통해 모듈 / 프로젝트를 다른 컴퓨터로 이식 할 수 있습니다.

프로젝트에서 수행하는 작업 :

A = '/Users/myname/Projects/mydevproject/somefile.txt'

그런 다음 배포 디렉토리를 사용하여 서버에 배포하려고하면 /home/web/mydevproject/코드에서 경로를 올바르게 찾을 수 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.