Python에서 현재 스크립트 이름 가져 오기


407

현재 실행중인 Python 스크립트의 이름을 얻으려고합니다.

스크립트 foo.py가 있는데 스크립트 이름을 얻기 위해 이와 같은 작업을 수행하고 싶습니다.

print Scriptname

답변:


620

__file__현재 파일의 이름을 얻는 데 사용할 수 있습니다 . 기본 모듈에서 사용될 때 이것은 원래 호출 된 스크립트의 이름입니다.

존재하는 디렉토리 부분을 생략하려면을 사용할 수 있습니다 os.path.basename(__file__).


15
파이썬 3.2 : " Exception NameError: NameError("global name '__file__' is not defined",)"
sdaau

20
@sdaau : __file__는 대화 형 인터프리터에 정의되어 있지 않습니다. 의미가 없기 때문입니다. 가져 오기 구현에 의해 설정되므로 비표준 가져 오기 메커니즘을 사용하면 설정되지 않을 수도 있습니다.
Sven Marnach

8
적어도 Python 2.7의 import os경우이 기능이 필요 하다고 생각합니다 . 나는 이것을 대답에 추가 할 것입니다.
Nick Chammas

14
@ cdunn2001 : import os그리고 import os.path완전히 동일합니다.
Sven Marnach

2
@ sven-marnach : 아, 맞습니다 . 나는 몇 년 동안 잘못하고있다!
cdunn2001

136
import sys
print sys.argv[0]

foo.pyfor python foo.py, dir/foo.pyfor python dir/foo.py등 을 인쇄 합니다 python. 첫 번째 인수 입니다. (py2exe 후에는입니다 foo.exe.)


33
@DenisMalinovsky : "작동하지 않음"을 정의하십시오. 당신이 호출 할 경우 python linkfile.py, 어디에서 linkfile.py할 수있는 심볼릭 링크 realfile.py, sys.argv[0]'linkfile.py'또는 당신이 원하는하지 않을 수 있습니다; 확실히 내가 기대하는 것 입니다. __file__동일합니다 linkfile.py. 에서 찾으려면을 ( 'realfile.py''linkfile.py') 시도하십시오 os.path.realpath('linkfile.py').
Chris Morgan

6
+1이기 때문에 +1이기 때문에 (1) 모듈에서 여전히 작동합니다 ( 파일 변수는 실행 파일이 아닌 모듈 파일입니다).
robert

이 답변은 유휴 상태에서도 작동하기 때문에 좋습니다. 참고로, 파일 이름 만 얻으려면 os.path.basename (sys.argv [0])을 작성하십시오.
Steven Bluen

더 중요한 것은 메인 파일 내부를 제외하고는 작동하지 않습니다. 이것을 사용 __file__하지 말고 대신 사용하십시오 .
Apollys는 Monica

뭐!!! 당신도 이것을 시도 했습니까? 정반대입니다. 질문자는 현재 실행중인 python 파일이 아닌 실행중인 python 스크립트의 이름을 요청했습니다. 오류가 발생하면 허용되는 인수와 함께 스크립트 이름을 인쇄하는 스크립트가 있다고 가정하십시오. 이 두 가지 기술 중 하나를 사용하여 함수에 넣습니다. 어떤 시점에서 함수를 외부 라이브러리로 이동하기로 결정합니다. 실행중인 기본 스크립트 이름 또는 실행중인 라이브러리 파일 이름을 인쇄 하시겠습니까?
John Deighan

71

완전성을 기하기 위해, 나는 다양한 가능한 결과를 요약하고 각각의 정확한 행동에 대한 참조를 제공하는 것이 가치가 있다고 생각했습니다.

  • __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추출하고 접미사없이 실제 파일 이름을 추출합니다.


66

__file__주 파일에서 수입과 다를 수 있습니다이 코드 상주, 해석되는 파일을 제공 할 것입니다. 메인 파일을 얻기 위해 특수 __main__ 모듈을 사용할 수 있습니다.

import __main__ as main
print(main.__file__)

주의 __main__.__file__는 휴대용하기 위해 위와 같이 파이썬 2.7이 아닌 3.2 작품, 그래서 수입과 같은 구문을 사용합니다.


이것은 많은 경우에 작동하지만 언어 에서 rPython패키지를 사용하는 경우에는 작동하지 않습니다 R. 처리하기가 너무 어려운 예외적 인 경우 여야합니다.
Leonid

실제로 rPython 패키지에는 python 인터프리터가 내장되어 있습니다. 즉, 파이썬이 자체적으로 실행될 때와 같은 '메인'파일이 없습니다 (파이썬이 내장 될 때마다 동일한 동작을 찾을 수 있습니다). 그것은 가져 오기를 수행 __main__사이에 변수를 전달에 사용하기 위해 내부적으로 R하고 python, 상대적으로 쉬울 것이다 그것을 설정하기 위해, 그래서 __main__.__file__무엇을 호출하기 전에,하지만 난 확실히이 경우 적절한 값 어떻게 될지 모르겠어요.
Perkins

42

위의 답변이 좋습니다. 그러나 위의 결과를 사용 하여이 방법이 더 효율적이라는 것을 알았습니다.
이로 인해 실제 스크립트 파일 이름이 경로가 아닙니다.

import sys    
import os    
file_name =  os.path.basename(sys.argv[0])

1
확장 프로그램도 분리하고 싶습니다. os.path.splitext (os.path.basename (sys.argv [0])) [0]
RufusVS

19

최신 Python 버전 (3.4+)의 Path(__file__).name경우 더 관용적이어야합니다. 또한 확장명이 Path(__file__).stem없는 스크립트 이름을 제공합니다 .py.


NameError : 이름 '경로'가 정의되지 않았습니다
RufusVS

5
from pathlib import Path먼저 해야합니다 .
Emil Melnikov

"modern"은 Python 3.x를 의미합니까?
einpoklum

1
@einpoklum pathlib은 Python 3.4에서 도입 되었으므로 Python 3.4부터 작동해야합니다.
Andrey Semakin


9

참고 : Python 3 이상을 사용하는 경우 대신 print () 함수를 사용해야합니다

파일 이름이이라고 가정하면 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


1
sys.argv [0] [:-3]
kon psych

더 우아한
@konpsych

이 사이에 큰 차이가있어 __file__sys.argv[0], 참조 stackoverflow.com/questions/5851588/...는
Maksym Ganenko

8

sys의 첫 번째 인수는 현재 파일 이름이므로 작동합니다.

   import sys
   print sys.argv[0] # will print the file name

7

비정상적인 가져 오기를 수행하는 경우 (예 : 옵션 파일) 다음을 시도하십시오.

import inspect
print (inspect.getfile(inspect.currentframe()))

이것은 파일의 절대 경로를 반환합니다.


3

확장명없이 현재 스크립트 이름을 얻기 위해 이것을 시도 할 수 있습니다.

import os

script_name = os.path.splitext(os.path.basename(__file__))[0]

2

OP가 현재 스크립트 파일의 이름을 요청했기 때문에 선호합니다

import os
os.path.split(sys.argv[0])[1]

0

내 더러운 더러운 해결책 :

__file__.split('/')[-1:][0]

2
os.path파일 이름 분할에 더 잘 사용
Maksym Ganenko


0

모든 대답은 훌륭하지만 약간의 문제가 있습니다. 언뜻보기에는 보지 못할 수도 있습니다.

현재 모듈의 이름이 아니라 실행 된 스크립트의 이름을 원합니다. 따라서 __file__가져온 모듈이 아닌 실행 된 스크립트에서 사용되는 경우에만 작동합니다. sys.argvpytest에 의해 프로그램이 호출되면 어떻게 될까요? 또는 pydoc 러너? 또는 uwsgi에 의해 호출 된 경우?

그리고-스크립트 이름을 얻는 세 번째 방법이 있습니다. 대답에서 보지 못했습니다. 스택을 검사 할 수 있습니다.

또 다른 문제는 당신 (또는 다른 프로그램) 주변에 변조 할 수있다 sys.argv__main__.__file__ -가있을 수도, 안 될 수도 있습니다. 유효하거나 유효하지 않을 수 있습니다. 적어도 스크립트 (원하는 결과)가 존재하는지 확인할 수 있습니다!

github의 내 라이브러리 bitranox / lib_programname은 정확히 다음을 수행합니다.

  • 확인 __main__존재
  • 확인 __main__.__file__존재
  • 준다 __main__.__file__유효한 결과를 합니까 (스크립트가 있습니까?)
  • 그렇지 않은 경우 : sys.argv를 확인하십시오.
  • sys.argv에 pytest, docrunner 등이 있습니까? -> 그렇다면, 무시
  • 여기서 유효한 결과를 얻을 수 있습니까?
  • 그렇지 않은 경우 : 스택을 검사하여 결과를 얻습니다.
  • 스택도 유효한 결과를 제공하지 않으면 예외를 처리하십시오.

그런 식으로, 내 솔루션은 지금까지와 협력 setup.py test, uwsgi, pytest, pycharm pytest, pycharm docrunner (doctest), dreampie,eclipse

Dough Hellman의 "Python에서 프로세스의 이름 결정"이라는 문제에 대한 멋진 블로그 기사도 있습니다.


0

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