2012-02-14 3 views
56
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 모듈을 이해하고 싶습니다.__file__ 변수는 무엇을 의미합니까 /할까요?

+5

물론, 그것은 와일드 카드 아니다. – tripleee

+3

그것의 "마술"변수; 와일드 카드는 아주 다른 것을 의미합니다. –

답변

66

모듈이 파이썬으로로드되면 __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 등)에서 실행해야합니다. documentation

+3

좋은 답변이지만 다른 답변에서 다른 중요한 사항을 참조하십시오. '__file__'은 (는) 모든 경우에 정의되어 있지 않습니다. 정적으로 링크 된 C 모듈. 우리는 항상'__file__ '을 사용할 수 있다고 기대할 수는 없습니다. –

+2

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

+2

@ user1063287 DemoUser의 대답을보세요. '__file__'은 파일이로드 된 경우 모듈이로드 된 파일의 경로 이름입니다. 이것은'__file__ '이 당신이 인터프리터가 아닌 스크립트로 실행할 때만 작동한다는 것을 의미합니다. (인터프리터에서 가져 오지 않는 한 ...) – YOUNG

10

:

__file__ 그것이 파일로부터로드 된 경우, 모듈, 로드 된 파일의 경로이다. __file__ 속성은 인터프리터에 정적으로 링크 된 C 모듈에 대해 이 아닙니다. 확장 모듈의 경우 이 공유 라이브러리에서 동적으로로드되면 공유 라이브러리 파일의 경로 이름입니다.

also :

__file__는 속성이 설정되지 않은 경우에 모듈이 (sys.builtin_module_names에 따라서 나열)에 내장되지 않는 파일에 대한 "경로"가 될 것입니다. 다양한 os.path 모듈과 결합 __file__를 사용

8

는 모든 경로가 현재 모듈의 디렉토리 위치의 상대가 될 수 있습니다. 이를 통해 모듈/프로젝트를 다른 시스템으로 이식 할 수 있습니다.

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

을 한 후 다음 코드가 제대로 경로를 찾을 수 없습니다 /home/web/mydevproject/ 같은 배포 디렉토리와 서버에 배포하려고 : 프로젝트에서

은 당신이 할.

30

나는 약간 혼란을 먼저 지적하고 싶다. __file__은 와일드 카드가 아니며 특성입니다. 이중 밑줄 특성과 메서드는 관례에 따라 "특별"한 것으로 간주되며 특수한 용도로 사용됩니다.

http://docs.python.org/reference/datamodel.html에는 특수한 방법과 속성이 많이 있지만 전부는 아닙니다.

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

이 문서에서 촬영 :

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

모듈이 자신의 __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 
관련 문제