답변:
__file__
현재 파일의 이름을 얻는 데 사용할 수 있습니다 . 기본 모듈에서 사용될 때 이것은 원래 호출 된 스크립트의 이름입니다.
존재하는 디렉토리 부분을 생략하려면을 사용할 수 있습니다 os.path.basename(__file__)
.
__file__
는 대화 형 인터프리터에 정의되어 있지 않습니다. 의미가 없기 때문입니다. 가져 오기 구현에 의해 설정되므로 비표준 가져 오기 메커니즘을 사용하면 설정되지 않을 수도 있습니다.
import os
경우이 기능이 필요 하다고 생각합니다 . 나는 이것을 대답에 추가 할 것입니다.
import os
그리고 import os.path
완전히 동일합니다.
import sys
print sys.argv[0]
foo.py
for python foo.py
, dir/foo.py
for python dir/foo.py
등 을 인쇄 합니다 python
. 첫 번째 인수 입니다. (py2exe 후에는입니다 foo.exe
.)
python linkfile.py
, 어디에서 linkfile.py
할 수있는 심볼릭 링크 realfile.py
, sys.argv[0]
것 'linkfile.py'
또는 당신이 원하는하지 않을 수 있습니다; 확실히 내가 기대하는 것 입니다. __file__
동일합니다 linkfile.py
. 에서 찾으려면을 ( 'realfile.py'
를 'linkfile.py'
) 시도하십시오 os.path.realpath('linkfile.py')
.
__file__
하지 말고 대신 사용하십시오 .
완전성을 기하기 위해, 나는 다양한 가능한 결과를 요약하고 각각의 정확한 행동에 대한 참조를 제공하는 것이 가치가 있다고 생각했습니다.
__file__
공식 문서에 설명 된대로 현재 실행중인 파일입니다 .
__file__
파일에서로드 된 경우 모듈이로드 된 파일의 경로 이름입니다.__file__
특성 등의 모듈, 특정 유형의 누락 될 수 C의 정적 인터프리터에 연결된 모듈; 공유 라이브러리에서 동적으로로드 된 확장 모듈의 경우 공유 라이브러리 파일의 경로 이름입니다.
Python3.4에서 이후, 당 문제 18416 , __file__
현재 실행 파일 (안와 인터프리터를 통해 직접 실행 된 스크립트가 아닌, 항상 절대 경로 -m
상대 경로를 사용하여 명령 행 옵션).
__main__.__file__
(가져 오기가 필요함 __main__
) 단순히 메인 모듈 의 앞서 언급 한 __file__
속성 , 예를 들어 명령 줄에서 호출 된 스크립트에 액세스합니다 .
sys.argv[0]
(가져 오기 필요 sys
)는 명령 행에서 호출 된 스크립트 이름이며 공식 문서에 설명 된대로 절대 경로 일 수 있습니다 .
argv[0]
스크립트 이름입니다 (전체 경로 이름인지 여부에 따라 운영 체제에 따라 다름).-c
인터프리터에 명령 행 옵션을 사용하여 명령이 실행 된argv[0]
경우 문자열로 설정됩니다'-c'
. Python 인터프리터에 스크립트 이름이 전달되지 않은 경우argv[0]
빈 문자열입니다.
에서 언급 한 바와 같이 이 질문에 다른 답변 , 파이썬 과 같은 도구를 통해 단독 실행 프로그램으로 변환 된 스크립트 py2exe에 또는 pyInstaller 중에이 이 방법을 사용하는 경우 (즉, 원하는 결과를 표시하지 않을 수 있습니다 sys.argv[0]
이름이 아닌 실행 파일의 이름을 길게 것 해당 실행 파일 내의 기본 Python 파일).
불규칙한 가져 오기 작업으로 인해 위에서 언급 한 옵션이 작동하지 않는 경우 inspect 모듈 이 유용 할 수 있습니다. 특히, 호출 inspect.getfile(...)
에 대한 것은 inspect.currentframe()
후자는 것이지만, 일할 수있는 반환None
하지 않고 구현에서 실행할 때 파이썬 스택 프레임.
현재 스크립트가 심볼릭 링크 인 경우 위의 모든 파일은 실제 파일의 경로가 아닌 심볼릭 링크의 경로를 반환 os.path.realpath(...)
하므로 후자를 추출하려면 호출해야합니다.
os.path.basename(...)
실제 파일 이름을 추출하기 위해 위의 어느 하나에서 os.path.splitext(...)
호출 될 수 있으며, 에서처럼 접미사를 자르기 위해 실제 파일 이름에서 호출 될 수 있습니다 os.path.splitext(os.path.basename(...))
.
에서 파이썬 3.4 이후, 당 PEP (428) 는 PurePath
클래스 의 pathlib
모듈은 물론 위의에 사용할 수있다. 특히 pathlib.PurePath(...).name
실제 파일 이름을 pathlib.PurePath(...).stem
추출하고 접미사없이 실제 파일 이름을 추출합니다.
주 __file__
주 파일에서 수입과 다를 수 있습니다이 코드 상주, 해석되는 파일을 제공 할 것입니다. 메인 파일을 얻기 위해 특수 __main__ 모듈을 사용할 수 있습니다.
import __main__ as main
print(main.__file__)
주의 __main__.__file__
는 휴대용하기 위해 위와 같이 파이썬 2.7이 아닌 3.2 작품, 그래서 수입과 같은 구문을 사용합니다.
rPython
패키지를 사용하는 경우에는 작동하지 않습니다 R
. 처리하기가 너무 어려운 예외적 인 경우 여야합니다.
__main__
사이에 변수를 전달에 사용하기 위해 내부적으로 R
하고 python
, 상대적으로 쉬울 것이다 그것을 설정하기 위해, 그래서 __main__.__file__
무엇을 호출하기 전에,하지만 난 확실히이 경우 적절한 값 어떻게 될지 모르겠어요.
최신 Python 버전 (3.4+)의 Path(__file__).name
경우 더 관용적이어야합니다. 또한 확장명이 Path(__file__).stem
없는 스크립트 이름을 제공합니다 .py
.
from pathlib import Path
먼저 해야합니다 .
pathlib
은 Python 3.4에서 도입 되었으므로 Python 3.4부터 작동해야합니다.
파일 이름이이라고 가정하면 foo.py
아래 스 니펫
import sys
print sys.argv[0][:-3]
또는
import sys
print sys.argv[0][::-1][3:][::-1]
더 많은 문자가 포함 된 다른 확장명 (예 : 파일 이름) foo.pypy
import sys
print sys.argv[0].split('.')[0]
절대 경로에서 추출하려는 경우
import sys
print sys.argv[0].split('/')[-1].split('.')[0]
출력합니다 foo
비정상적인 가져 오기를 수행하는 경우 (예 : 옵션 파일) 다음을 시도하십시오.
import inspect
print (inspect.getfile(inspect.currentframe()))
이것은 파일의 절대 경로를 반환합니다.
os.path.abspath(__file__)
당신에게 절대 경로를 줄 것 relpath()
입니다.
sys.argv[-1]
상대 경로를 제공합니다.
모든 대답은 훌륭하지만 약간의 문제가 있습니다. 언뜻보기에는 보지 못할 수도 있습니다.
현재 모듈의 이름이 아니라 실행 된 스크립트의 이름을 원합니다. 따라서 __file__
가져온 모듈이 아닌 실행 된 스크립트에서 사용되는 경우에만 작동합니다.
sys.argv
pytest에 의해 프로그램이 호출되면 어떻게 될까요? 또는 pydoc 러너? 또는 uwsgi에 의해 호출 된 경우?
그리고-스크립트 이름을 얻는 세 번째 방법이 있습니다. 대답에서 보지 못했습니다. 스택을 검사 할 수 있습니다.
또 다른 문제는 당신 (또는 다른 프로그램) 주변에 변조 할 수있다 sys.argv
및__main__.__file__
-가있을 수도, 안 될 수도 있습니다. 유효하거나 유효하지 않을 수 있습니다. 적어도 스크립트 (원하는 결과)가 존재하는지 확인할 수 있습니다!
github의 내 라이브러리 bitranox / lib_programname은 정확히 다음을 수행합니다.
__main__
존재__main__.__file__
존재__main__.__file__
유효한 결과를 합니까 (스크립트가 있습니까?)그런 식으로, 내 솔루션은 지금까지와 협력 setup.py test
, uwsgi
, pytest
, pycharm pytest
, pycharm docrunner (doctest)
, dreampie
,eclipse
Dough Hellman의 "Python에서 프로세스의 이름 결정"이라는 문제에 대한 멋진 블로그 기사도 있습니다.
파이썬 3.5부터 간단하게 할 수 있습니다 :
from pathlib import Path
Path(__file__).stem
자세한 내용은 여기를 참조하십시오 : https://docs.python.org/3.5/library/pathlib.html#pathlib.PurePath.stem
예를 들어, 사용자 디렉토리 아래에 이름 test.py
이 다음과 같은 파일 이 있습니다.
from pathlib import Path
print(Path(__file__).stem)
print(__file__)
이 출력을 실행 :
>>> python3.6 test.py
test
test.py
Exception NameError: NameError("global name '__file__' is not defined",)
"