Python 스크립트의 파일 이름 및 줄 번호
파이썬 스크립트에서 파일 이름과 줄 번호를 얻으려면 어떻게 해야 합니까?
바로 예외 추적에서 얻은 파일 정보입니다.이 경우 예외를 제기하지 않습니다.
mandre 덕분에 답은 다음과 같습니다.
#python3
from inspect import currentframe, getframeinfo
frameinfo = getframeinfo(currentframe())
print(frameinfo.filename, frameinfo.lineno)
사용 여부currentframe().f_back
함수를 사용하는지 여부에 따라 달라집니다.
검사를 직접 호출:
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()
공용 파일에서 사용할 경우 편리합니다. 호출자의 파일 이름, 회선 번호 및 기능을 인쇄합니다.
import inspect
def getLineInfo():
print(inspect.stack()[1][1],":",inspect.stack()[1][2],":",
inspect.stack()[1][3])
sys도 사용하는게 더 좋아요.
import 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
파일 이름:
__file__
# or
sys.argv[0]
선:
inspect.currentframe().f_lineno
(아닙니다.inspect.currentframe().f_back.f_lineno
위에서 언급한 바와 같이)
Python 3에서는 다음과 같은 변형을 사용할 수 있습니다(Claudio의 코멘트 이후 개선되었습니다).
def Deb(msg=""):
print(f"Debug {sys._getframe().f_back.f_lineno}: {msg}")
코드에서 다음을 사용할 수 있습니다.
Deb("Some useful information")
Deb()
제작 방법:
123: Some useful information
124:
여기서 123과 124는 콜의 발신기지 회선입니다.
그저 기여하기 위해,
가 있습니다.linecache
python의 모듈, 여기 도움이 될 수 있는 두 개의 링크가 있습니다.
어떤 의미에서 전체 파일을 캐시에 "던지고" 클래스의 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() )
import inspect
file_name = __FILE__
current_line_no = inspect.stack()[0][2]
current_function_name = inspect.stack()[0][3]
#Try printing inspect.stack() you can see current stack and pick whatever you want
파일 이름과 줄 번호를 인쇄하는 간단한 기능이 있습니다.
from inspect import currentframe, getframeinfo
def HERE(do_print=True):
''' Get the current file and line number in Python script. The line
number is taken from the caller, i.e. where this function is called.
Parameters
----------
do_print : boolean
If True, print the file name and line number to stdout.
Returns
-------
String with file name and line number if do_print is False.
Examples
--------
>>> HERE() # Prints to stdout
>>> print(HERE(do_print=False))
'''
frameinfo = getframeinfo(currentframe().f_back)
filename = frameinfo.filename.split('/')[-1]
linenumber = frameinfo.lineno
loc_str = 'File: %s, line: %d' % (filename, linenumber)
if do_print:
print('HERE AT %s' % (loc_str))
else:
return loc_str
용도:
HERE() # Prints to stdout
# Output: HERE AT File: model.py, line: 275
print(HERE(False)) # Retrieves string and prints it.
# Output: File: model.py, line: 276
다음은 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
골랑 스타일
import inspect
import sys
import atexit
ERR_FILE = open('errors.log', 'w+', encoding='utf-8')
LOG_FILE = open('log.log', 'w+', encoding='utf-8')
def exit_handler():
# ctrl + C works as well
log("Exiting")
ERR_FILE.close()
LOG_FILE.close()
# close files before exit
atexit.register(exit_handler)
def log(*args, files=[sys.stdout, LOG_FILE]):
# can also add timestamps etc.
cf = inspect.currentframe()
for f in files:
print("DEBUG", f"{inspect.stack()[1][1]}:{cf.f_back.f_lineno}", *args, file=f)
f.flush()
def log_err(*args, files=[ERR_FILE, sys.stderr]):
cf = inspect.currentframe()
for f in files:
print("ERROR", f"{inspect.stack()[1][1]}:{cf.f_back.f_lineno}", *args, file=f)
f.flush()
log("Hello World!")
log_err("error")
산출량
DEBUG sample.py:29 Hello World!
ERROR sample.py:30 error
DEBUG sample.py:9 Exiting
위의 많은 답변과 JavaScript의 console.log() 기능에서 영감을 받아 이 목적을 달성하기 위해 pip 패키지를 배포했습니다.이것 좀 확인해 주세요.
설치 방법?
다음 명령을 사용하여 패키지를 설치합니다.
pip3 install print_position
간단한 예는 (test.py )입니다.
from printPosition.printPosition import printPosition as print
print("Test on line 2 from test.py")
print("Test on line 3 from test.py")
print("Test on line 7 from test.py")
위 코드의 출력은 다음과 같습니다.
@/home/pranav/Desktop/GitHub/PrintPosition-pip/print-log/test.py: 2
Test on line 2 from test.py
@/home/pranav/Desktop/GitHub/PrintPosition-pip/print-log/test.py: 3
Test on line 3 from test.py
@/home/pranav/Desktop/GitHub/PrintPosition-pip/print-log/test.py: 7
Test on line 7 from test.py
도움이 되었다면 알려주세요!또한 모든 문제/요청 사항을 자유롭게 제기하십시오. 모든 사항이 여기 pip 페이지에 언급되어 있습니다.
언급URL : https://stackoverflow.com/questions/3056048/filename-and-line-number-of-python-script
'programing' 카테고리의 다른 글
VBA의 하위 문자열 (0) | 2023.06.17 |
---|---|
Vuex - 5초마다 대용량 데이터 청크 폴링 시 메모리 누수/JS 힙 크기 (0) | 2023.06.17 |
루비에서 조건 연산자(? :)는 어떻게 사용하나요? (0) | 2023.06.17 |
루비에서 지도(&:name)는 무엇을 의미합니까? (0) | 2023.06.17 |
DeepL API를 사용하여 텍스트 번역 (0) | 2023.06.17 |