파이썬 스크립트의 파일 이름과 줄 번호


113

파이썬 스크립트에서 파일 이름과 줄 번호를 어떻게 얻을 수 있습니까?

예외 추적에서 얻은 정확한 파일 정보입니다. 이 경우 예외를 발생시키지 않습니다.

답변:


161

mcandre 덕분에 대답은 다음과 같습니다.

#python3
from inspect import currentframe, getframeinfo

frameinfo = getframeinfo(currentframe())

print(frameinfo.filename, frameinfo.lineno)

1
이 방법을 사용하면 성능에 영향이 있습니까 (예 : 런타임이 약간 증가하거나 더 많은 CPU가 필요함)?
gsinha 2014 dec.

6
@gsinha : 모든 함수 호출은 성능에 영향을 미칩니다. 이 영향이 허용 가능한지 측정해야합니다.
omikron 2015

5
따라서 "한 줄"을 입력하려면 다음을 입력하십시오.import inspect inspect.getframeinfo(inspect.currentframe()).lineno
1-ijk

1
@LimokPalantaemon currentframe()이 호출 될 때 발생합니다. 즉, 더 이상 단순화 할 수 없습니다 getframeinfo(currentframe()).lineno(파일 이름이 아닌 줄 번호 만 신경 쓰는 경우). 참조 docs.python.org/2/library/inspect.html#inspect.currentframe
아론 밀러에게

1
@joey, print 문에 괄호가 있어야하지 않습니까?
MCG

49

사용 currentframe().f_back여부는 기능 사용 여부에 따라 다릅니다.

inspect를 직접 호출 :

from inspect import currentframe, getframeinfo

cf = currentframe()
filename = getframeinfo(cf).filename

print "This is line 5, python says line ", cf.f_lineno 
print "The filename is ", filename

당신을 위해 그것을하는 함수 호출 :

from inspect import currentframe

def get_linenumber():
    cf = currentframe()
    return cf.f_back.f_lineno

print "This is line 7, python says line ", get_linenumber()

2
하나는 호출 가능한 함수에서 솔루션을 제공하기위한 것입니다. 아주 좋아요!
MikeyE 2010 년

21

일반 파일에서 사용하면 편리합니다. 파일 이름, 줄 번호 및 호출자의 기능을 인쇄합니다.

import inspect
def getLineInfo():
    print(inspect.stack()[1][1],":",inspect.stack()[1][2],":",
          inspect.stack()[1][3])

11

파일명 :

__file__
# or
sys.argv[0]

라인 :

inspect.currentframe().f_lineno

( inspect.currentframe().f_back.f_lineno위에서 언급 하지 않음 )


NameError: global name '__file__' is not defined내 파이썬 인터프리터 : Python 2.7.6 (default, Sep 26 2014, 15:59:23). stackoverflow.com/questions/9271464/…
bgoodr 2017

10

sys를 사용하는 것이 더 좋습니다.

print dir(sys._getframe())
print dir(sys._getframe().f_lineno)
print sys._getframe().f_lineno

출력은 다음과 같습니다.

['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'f_back', 'f_builtins', 'f_code', 'f_exc_traceback', 'f_exc_type', 'f_exc_value', 'f_globals', 'f_lasti', 'f_lineno', 'f_locals', 'f_restricted', 'f_trace']
['__abs__', '__add__', '__and__', '__class__', '__cmp__', '__coerce__', '__delattr__', '__div__', '__divmod__', '__doc__', '__float__', '__floordiv__', '__format__', '__getattribute__', '__getnewargs__', '__hash__', '__hex__', '__index__', '__init__', '__int__', '__invert__', '__long__', '__lshift__', '__mod__', '__mul__', '__neg__', '__new__', '__nonzero__', '__oct__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdiv__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'imag', 'numerator', 'real']
14

6

기여하기 위해

linecache파이썬에서 모듈이 여기에 도움이 될 수 있습니다 두 개의 링크입니다.

linecache 모듈 설명서
linecache 소스 코드

어떤 의미에서 전체 파일을 캐시에 "덤프"하고 클래스의 linecache.cache 데이터로 읽을 수 있습니다.

import linecache as allLines
## have in mind that fileName in linecache behaves as any other open statement, you will need a path to a file if file is not in the same directory as script
linesList = allLines.updatechache( fileName ,None)
for i,x in enumerate(lineslist): print(i,x) #prints the line number and content
#or for more info
print(line.cache)
#or you need a specific line
specLine = allLines.getline(fileName,numbOfLine)
#returns a textual line from that number of line

추가 정보를 보려면 오류 처리를 위해

from sys import exc_info
try:
     raise YourError # or some other error
except Exception:
     print(exc_info() )


3

Python 3에서는 다음에 대한 변형을 사용할 수 있습니다.

def Deb(msg = None):
  print(f"Debug {sys._getframe().f_back.f_lineno}: {msg if msg is not None else ''}")

코드에서 다음을 사용할 수 있습니다.

Deb("Some useful information")
Deb()

생산하는:

123: Some useful information
124:

123과 124는 전화를 거는 라인입니다.


0

다음은 VSCode 1.39.2의 Python 3.7.3에서 줄 번호를 얻는 데 효과적입니다 ( dmsg디버그 메시지에 대한 니모닉입니다).

import inspect

def dmsg(text_s):
    print (str(inspect.currentframe().f_back.f_lineno) + '| ' + text_s)

변수 name_s및 해당 값 표시를 호출하려면 :

name_s = put_code_here
dmsg('name_s: ' + name_s)

출력은 다음과 같습니다.

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