2010-09-14 9 views
62

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

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

import inspect 

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

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

hello() 

उत्तर

67

कॉलर का फ्रेम वर्तमान फ्रेम की तुलना में एक फ्रेम अधिक है। कॉलर के फ्रेम को ढूंढने के लिए आप 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()) 

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

धन्यवाद है। मैं कॉलर के कॉलर कैसे प्राप्त कर सकता हूं? – prosseek

+4

@prosseek: कॉलर के कॉलर प्राप्त करने के लिए, केवल सूचकांक '[1] 'से' [2] 'बदलें। ('निरीक्षण .getouterframes' फ्रेम की एक सूची देता है ...)। पायथन खूबसूरती से व्यवस्थित है। – unutbu

+3

आप inspect.currentframe()। F_back का भी उपयोग कर सकते हैं। – yoyo

36

मैं बजाय 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() 
+0

@unutbu द्वारा सुझाए गए अनुसार 'गेटौटरफ्रेम' का उपयोग करने से बेहतर कैसे है? – ixe013

+7

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

+0

ध्यान दें कि 'getouterframes (currentframe()) 'और' stack() 'हुड के नीचे समतुल्य हैं https://github.com/python/cpython/blob/master/Lib/inspect.py#L1442 – ubershmekel

-4

फोन करने वाले मुख्य फ़ाइल है, तो बस sys.argv का उपयोग [0]

1

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

जैसे pysourceinfo.PySourceInfo.getCallerLinenumber(spos=1)

जहां spos=0 lib-समारोह है, spos=1 फोन करने वाले, spos=2 फोन करने वाले के-कॉलर, आदि के लिए जवाब

संबंधित मुद्दे