2012-10-31 2 views
15

मैं कमांड लाइन से प्रोफाइल में pycallgraph का उपयोग कर रहा हूं और अपेक्षाकृत सरल प्रोग्राम के कॉल ग्राफ़ को खींच रहा हूं। हालांकि, परिणामी छवि में मानक पुस्तकालयों (थ्रेडिंग, जेसन, सॉकेट) के आंतरिक शामिल हैं, भले ही मैं -s कमांड लाइन विकल्प का उपयोग न करें। उन मॉड्यूल को बाहर करने के लिए -ई विकल्प का उपयोग करने से कोई प्रभाव नहीं पड़ता है और -i परिणाम रिक्त कॉल ग्राफ़ में उपयोग करते हैं। मैंने सीप्रोफाइल भी कोशिश की है, लेकिन यह केवल मुख्य धागा को ग्राफ करता है।मानक पुस्तकालय कार्यों में प्रवेश करने से pycallgraph को कैसे रोकें?

मैं अपने कोड में केवल कॉल दिखाने के लिए पिक्सेलग्राफ कैसे बना सकता हूं? वर्तमान गन्दा परिणाम बेकार है।

संपादित करें: मैं 0.5.1 का उपयोग कर रहा हूं, easy_install के माध्यम से उपलब्ध है। चल रहा है pycallgraph ./cursesclient.py यह आउटपुट करता है: a messy call graph। जैसा कि आप देख सकते हैं, pycallgraph मॉड्यूल जेसन, पुनः, एन्कोडिंग, सॉकेट और थ्रेडिंग के आंतरिक दिखाते हैं। पुनः और एन्कोडिंग को सीधे मेरे कोड में कभी भी नहीं कहा जाता है, लेकिन क्रमशः जेसन और सॉकेट के माध्यम से।

+0

वैसे भी, मुझे pycallgraph पर इंगित करने के लिए धन्यवाद। –

+0

आप किस संस्करण का उपयोग करते हैं? 0.5.1 में मैं केवल 'pycallgraph mycode.py' को कॉल करने के साथ ही अपने कार्यों के साथ ग्राफ बना सकता हूं, लेकिन विकल्प '-s' कुछ मॉड्यूल को अनदेखा करता है जैसे 'functools' – adray

उत्तर

5

pycallgraph में एक अनियंत्रित stop_trace() विधि है जिसका उपयोग आप कोड के अनुभागों को बाहर करने के लिए उपयोग कर सकते हैं। कुछ

import pycallgraph 
import mycode 
import stuff_i_dont_want_to_see 

pycallgraph.start_trace() 
#Initializations 

pycallgraph.stop_trace() 
stuff_i_dont_want_to_see() 
pycallgraph.start_trace() 

mycode.things() 
pycallgraph.make_dot_graph('cleaner_graph.png') 

क्या आप इसके बाद क्या कर रहे हैं?

source

+2

टाइपिंग जो मैं चाहता था में काफी अधिक परिणाम देता है, लेकिन लपेटने के लिए यह कठिन है ग्राफ़िंग और प्रोफाइलिंग से बचने के लिए सभी मानक लाइब्रेरी कॉल; विशेष रूप से इसलिए क्योंकि pycallgraph की कमांड लाइन के अनुसार इसे डिफ़ॉल्ट रूप से ग्राफ़ नहीं करना चाहिए। हालांकि, चूंकि यह लगभग एक महीने हो गया है, इसलिए मैं बेहतर विकल्प की अनुपस्थिति में आपका उत्तर स्वीकार करूंगा। – andyn

10

Pycallgraph को फिल्टर करने की किसी भी मॉड्यूल, वर्ग छानने क्षमता प्रदान करता है या कार्य करते हैं आप कॉल ग्राफ से बाहर करना चाहते हैं। बाद समारोह परिभाषित किया जाना चाहिए इससे पहले कि आप का पता लगाने शुरू करने और pycallgraph को

उदाहरण

def filtercalls(call_stack, modul, clas, func, full): 
    mod_ignore = ['shutil','scipy.optimize','re','os','sys','json'] 
    func_ignore = ['CustomFunctionName','pdbcall'] 
    clas_ignore = ['pdb'] 
    return modul not in mod_ignore and func not in func_ignore and clas not in clas_ignore 

pycallgraph का पता लगाने शुरू

pycallgraph.start_trace(filter_func=filtercalls) 

इस तरह, किसी भी मॉड्यूल, वर्ग है पारित कर दिया है या आप में प्रदान ढंग से काम फ़िल्टरकॉल हटा दिए जाएंगे। कृपया ध्यान दें कि मॉड्यूल नाम प्रदान करने वाले मानक पुस्तकालयों में कई बार पर्याप्त नहीं है। इस प्रकार, mod_ignore में numpy सहित अभी भी numpy.core में शामिल किया जाएगा

+3

तर्कसंगत रूप से सही उत्तर होना चाहिए क्योंकि ओपी ने जो पूछा है, उदाहरण के लिए थ्रेडिंग सीमित करना आपके स्वयं के थ्रेड इंस्टेंस को समाप्त किए बिना भी 'सही' उत्तर का उपयोग किए बिना संभव नहीं हो सकता है – CrackerJack9

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