답변:
__file__현재 파일의 이름을 얻는 데 사용할 수 있습니다 . 기본 모듈에서 사용될 때 이것은 원래 호출 된 스크립트의 이름입니다.
존재하는 디렉토리 부분을 생략하려면을 사용할 수 있습니다 os.path.basename(__file__).
__file__는 대화 형 인터프리터에 정의되어 있지 않습니다. 의미가 없기 때문입니다. 가져 오기 구현에 의해 설정되므로 비표준 가져 오기 메커니즘을 사용하면 설정되지 않을 수도 있습니다.
import os경우이 기능이 필요 하다고 생각합니다 . 나는 이것을 대답에 추가 할 것입니다.
import os그리고 import os.path완전히 동일합니다.
import sys
print sys.argv[0]
foo.pyfor python foo.py, dir/foo.pyfor 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.argvpytest에 의해 프로그램이 호출되면 어떻게 될까요? 또는 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",)"