पायथन लिपि का फ़ाइल नाम और पंक्ति संख्या


113

मैं अजगर स्क्रिप्ट में फ़ाइल का नाम और लाइन नंबर कैसे प्राप्त कर सकता हूं।

बिल्कुल सही फ़ाइल जानकारी हमें एक अपवाद ट्रेसबैक से मिलती है। इस मामले में एक अपवाद के बिना।

जवाबों:


161

Mcandre के लिए धन्यवाद, इसका उत्तर है:

#python3
from inspect import currentframe, getframeinfo

frameinfo = getframeinfo(currentframe())

print(frameinfo.filename, frameinfo.lineno)

1
क्या इस पद्धति का उपयोग करने से कोई प्रदर्शन प्रभाव पड़ता है (जैसे कि रन समय में मामूली वृद्धि या अधिक सीपीयू की आवश्यकता)?
gsinha

6
@gsinha: हर फ़ंक्शन कॉल का प्रदर्शन प्रभाव होता है। आपको यह मापना होगा कि क्या यह प्रभाव आपके लिए स्वीकार्य है।
ओमिक्रॉन

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, क्या प्रिंट स्टेटमेंट में कोष्ठक नहीं होना चाहिए?
एमसीजी

49

आप उपयोग 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()

2
प्लस वन, कॉल करने योग्य फ़ंक्शन में समाधान प्रदान करने के लिए। बहुत अच्छा!
मिकी

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

10

सीस का उपयोग करने के लिए बेहतर भी-

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

पायथन 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 में पायथन 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.