programing

Python 스크립트의 파일 이름 및 줄 번호

powerit 2023. 6. 17. 09:45
반응형

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는 콜의 발신기지 회선입니다.

그저 기여하기 위해,

가 있습니다.linecachepython의 모듈, 여기 도움이 될 수 있는 두 개의 링크가 있습니다.

라인 캐시 모듈 설명서
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() )
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

반응형