पायथन में कॉलली से कॉलर की जानकारी प्राप्त करने के लिए निरीक्षण का उपयोग कैसे करें?


80

मुझे कैली से कॉलर जानकारी (क्या फ़ाइल / क्या लाइन) प्राप्त करने की आवश्यकता है। मैंने सीखा है कि मैं प्रयोजनों के लिए inpect मॉड्यूल का उपयोग कर सकता हूं, लेकिन बिल्कुल कैसे नहीं।

निरीक्षण के साथ उन जानकारी को कैसे प्राप्त करें? या जानकारी प्राप्त करने का कोई और तरीका है?

import inspect

print __file__
c=inspect.currentframe()
print c.f_lineno

def hello():
    print inspect.stack
    ?? what file called me in what line?

hello()

जवाबों:


99

कॉलर का फ्रेम वर्तमान फ्रेम की तुलना में एक फ्रेम अधिक है। आप inspect.currentframe().f_backकॉलर का फ़्रेम ढूंढने के लिए उपयोग कर सकते हैं । फिर कॉल करने वाले का नाम और लाइन नंबर प्राप्त करने के लिए inspect.getframeinfo का उपयोग करें ।

import inspect

def hello():
    previous_frame = inspect.currentframe().f_back
    (filename, line_number, 
     function_name, lines, index) = inspect.getframeinfo(previous_frame)
    return (filename, line_number, function_name, lines, index)

print(hello())

# ('/home/unutbu/pybin/test.py', 10, '<module>', ['hello()\n'], 0)

7
@prosseek: कॉल करने वाले का कॉलर प्राप्त करने के लिए, बस इंडेक्स [1]को बदलें [2]। ( inspect.getouterframesतख्ते की एक सूची देता है ...)। अजगर को खूबसूरती से व्यवस्थित किया गया है।
unutbu

3
तुम भी निरीक्षण का उपयोग कर सकते हैं। समानांतर ()। F_back।
योयो

यह फ़ाइलनाम का पूर्ण पथ प्राप्त करने का एक तरीका प्रदान करता प्रतीत नहीं होता है।
जेसन एस

2
@ जैसन: "स्टैक फ्रेम में फ़ाइलनाम अनुप्रयोग की स्टार्ट अप निर्देशिका के सापेक्ष है "।
19

4
यह कोड नमूना काम करता है लेकिन बहुत खराब प्रदर्शन करता है। यदि आप केवल एक ही फ्रेम में रुचि रखते हैं और पूरे स्टैक ट्रेस में नहीं हैं, तो आप पिछले फ्रेम को प्राप्त कर सकते हैं और फ्रेम जानकारी के लिए इसका निरीक्षण कर सकते हैं: filename, line_number, clsname, lines, index = inspect.getframeinfo(sys._getframe(1))
मौसमी

47

मैं inspect.stackइसके बजाय उपयोग करने का सुझाव दूंगा:

import inspect

def hello():
    frame,filename,line_number,function_name,lines,index = inspect.stack()[1]
    print(frame,filename,line_number,function_name,lines,index)
hello()

getouterframes@Unutbu द्वारा सुझाए गए उपयोग से यह कैसे बेहतर है ?
ixe013

8
यह अधिक कॉम्पैक्ट है और बेहतर इरादे को दर्शाता है।
दिमित्री के।

ध्यान दें कि getouterframes(currentframe())और stack()के तहत हुड बराबर हैं github.com/python/cpython/blob/master/Lib/inspect.py#L1442
ubershmekel

1
स्टैक () का उपयोग करने का एक और कारण यह है कि यह दिखाता है कि आसानी से अन्य फ़्रेम कैसे प्राप्त करें। यदि, उदाहरण के लिए। आपके हैलो () फ़ंक्शन को पहले किसी अन्य फ़ंक्शन द्वारा बुलाया जाता है, आप इसे दो स्तरों पर वापस जाने के लिए अपडेट कर सकते हैं।
चार्ल्स प्लेगर

2

मैंने एक ही पैरामीटर द्वारा स्टैक फ्रेम को कवर करने वाले सरल स्टैकफ्रेम के साथ निरीक्षण के लिए एक आवरण प्रकाशित किया spos:

उदाहरण के लिए pysourceinfo.PySourceInfo.getCallerLinenumber(spos=1)

spos=0लिब-फंक्शन कहां है, spos=1कॉल करने वाला, spos=2कॉल करने वाला, आदि।


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