मैं अजगर स्क्रिप्ट में फ़ाइल का नाम और लाइन नंबर कैसे प्राप्त कर सकता हूं।
बिल्कुल सही फ़ाइल जानकारी हमें एक अपवाद ट्रेसबैक से मिलती है। इस मामले में एक अपवाद के बिना।
मैं अजगर स्क्रिप्ट में फ़ाइल का नाम और लाइन नंबर कैसे प्राप्त कर सकता हूं।
बिल्कुल सही फ़ाइल जानकारी हमें एक अपवाद ट्रेसबैक से मिलती है। इस मामले में एक अपवाद के बिना।
जवाबों:
Mcandre के लिए धन्यवाद, इसका उत्तर है:
#python3
from inspect import currentframe, getframeinfo
frameinfo = getframeinfo(currentframe())
print(frameinfo.filename, frameinfo.lineno)
import inspect inspect.getframeinfo(inspect.currentframe()).lineno
currentframe()
कहा जाता है, जिसका अर्थ है कि आप इसे और अधिक सरल नहीं कर सकते हैं getframeinfo(currentframe()).lineno
(यदि आप केवल पंक्ति संख्या और फ़ाइल नाम के बारे में परवाह करते हैं)। Docs.python.org/2/library/inspect.html#inspect.currentframe
आप उपयोग 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])
फ़ाइल नाम :
__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/...
सीस का उपयोग करने के लिए बेहतर भी-
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
बस योगदान करने के लिए,
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() )
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
__file__
: देखें stackoverflow.com/questions/3056048/…
पायथन 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 की लाइनें हैं, जहां से कॉल की जाती है।
यहाँ 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