2012-12-20 22 views
31

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

उत्तर

4

संक्षेप में, ऐसा कोई उपकरण मौजूद नहीं है। पाइथन कोड को निष्पादित किए बिना कॉल ग्राफ़ उत्पन्न करने में सक्षम होने के लिए एक भाषा का बहुत गतिशील है।

class my_obj(object): 
    def __init__(self, item): 
     self.item = item 
    def item_to_power(self, power): 
     return self.item ** power 

def strange_power_call(obj): 
    to_call = "item_to_power" 
    return getattr(obj, to_call)(4) 

a = eval("my" + "_obj" + "(12)") 
b = strange_power_call(a) 

ध्यान दें कि हम eval का उपयोग कर रहे my_obj का एक उदाहरण बनाने के लिए और भी getattr का उपयोग कर अपने तरीकों में से एक कॉल करने के लिए:

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

मुझे लगता है कि आपकी सबसे अच्छी शर्त कोड बेस और पेपर के पैड के साथ बैठना है, और हाथों से नोट्स लेना शुरू करना है। कोड कोड के साथ आपको अधिक परिचित बनाने का दोहरा लाभ होगा, और परिदृश्यों को पार्स करने में मुश्किल से आसानी से धोखा नहीं दिया जाएगा।

+0

मुझे पता है। अधिकतर, मॉड्यूल के भीतर _import_, _def_ और _func() _ कथन की खोज कर सकते हैं। मुझे लगता है कि मैं ऐसा करने के लिए एक कार्यक्रम लिखूंगा। बेशक, यह केवल _simple_ स्रोत कोड पर काम करेगा। – JohnnyDH

+0

केवल * अत्यंत * सरल वाले। आपको टिप्पणियों, तारों और डॉकस्ट्रिंग को भी पार्स करने की आवश्यकता होगी, ताकि आप उन लोगों द्वारा मूर्ख बन सकें। मैंने अपना जवाब संपादित करने के लिए संपादित किया है जो मुझे लगता है कि आपको वास्तव में करना चाहिए। – Wilduck

+2

हां, मैं इसे मैन्युअल रूप से कर रहा हूं ... 14 संदर्भित स्क्रिप्ट हैं ... मुझे शुभकामनाएँ :) – JohnnyDH

20

आप pycallgraph की जाँच करने के लिए चाहते हो सकता है:

pycallgraph

इसके अलावा इस लिंक एक और अधिक मैनुअल दृष्टिकोण वर्णन किया गया है में

:

generating-call-graphs-for-understanding-and-refactoring-python-code

+2

हां, मैंने अपने शोध के दौरान इस पृष्ठ को देखा है लेकिन मैं एक "पेशेवर" समाधान की तलाश में हूं। मुझे डर है कि ऐसी चीज मौजूद नहीं है ... नया स्टार्ट-अप विचार? Hehe – JohnnyDH

+0

Pycallgraph दुर्भाग्यवश – chiffa

+3

pycallgraph कोड चला रहा है, जो पैकेज को पच नहीं करता है, जिसे उसने नहीं करने के लिए कहा था। पयान स्थिर विश्लेषण करता है (नीचे मेरा जवाब देखें) –

16

सबसे अच्छा उपकरण मैंने पाया कहा जाता है pyan, और originally writtenEdmund Horner, improved by him, और फिर given colorization औरद्वारा अन्य सुविधाएं थीं।

Usage: pyan.py FILENAME... [--dot|--tgf] 

Analyse one or more Python source files and generate an approximate call graph 
of the modules, classes and functions within them. 

Options: 
    -h, --help   show this help message and exit 
    --dot    output in GraphViz dot format 
    --tgf    output in Trivial Graph Format 
    -v, --verbose  verbose output 
    -d, --defines  add edges for 'defines' relationships [default] 
    -n, --no-defines  do not add edges for 'defines' relationships 
    -u, --uses   add edges for 'uses' relationships [default] 
    -N, --no-uses  do not add edges for 'uses' relationships 
    -c, --colored  color nodes according to namespace [dot only] 
    -g, --grouped  group nodes (create subgraphs) according to namespace 
         [dot only] 
    -e, --nested-groups create nested groups (subgraphs) for nested namespaces 
         (implies -g) [dot only] 

यहाँ pyan.py --dot -c -e pyan.py | fdp -Tpng चलाने का परिणाम है::

pyan's output on itself

एडमंड होर्नर के मूल कोड अब सबसे अच्छा in his github repository पाया जाता है, और किसी को भी एक repository with both versions बना दिया है जहां से, यही कारण है कि संस्करण उपयोगी कमांडलाइन विकल्प हैं आप download Juha Jeronen's version कर सकते हैं। मैंने my own repository just for pyan में उनके योगदान को एक साफ संस्करण बनाया है, क्योंकि दोनों रिपॉजिटरीज़ में कई अन्य सॉफ़्टवेयर हैं।

+0

मैंने अपनी खुद की भंडार को देखा। कोड कॉपीराइट लाइसेंस के साथ नहीं आता है, इसलिए आरक्षित अधिकारों की कोई सत्यापित छूट नहीं है - इसका मतलब है कि लोगों के लिए इसका उपयोग करना प्रतिबंधित है ... क्या आप एमआईटी लाइसेंस जैसे लाइसेंस जोड़ सकते हैं ताकि यह तकनीक कर सके पाइथन कोड रिपोर्ट के लिए एक आधार रेखा फैलाएं और सेट करें? – codeshot

+0

अच्छा बिंदु। वे मूल रूप से जीपीएल v2 के तहत प्रकाशित किए गए थे, इसलिए मैंने इसे दिखाने के लिए कोड अपडेट किया है, और एक [ब्लॉग टिप्पणी] छोड़ दिया है (https://ejrh.wordpress.com/2012/08/18/coloured-call-graphs/ # टिप्पणी-1365) यह –

+0

सत्यापित करने के लिए @DavidFraser यह Python 3.x के साथ संगत है? –

-3

कोई भी भाषा किसी भी भाषा में किसी भी प्रोग्राम के लिए मौजूद नहीं है। इस तरह का एक उपकरण बनाना रोकथाम की समस्या को हल करने के बराबर होगा, जो अपरिहार्य है। सीधे शब्दों में कहें, एक मनमाना कार्यक्रम और उसके इनपुट को देखते हुए यह निर्धारित करने के लिए कोई एल्गोरिदम नहीं है कि प्रोग्राम हमेशा के लिए रुक जाएगा या चलाएगा। इसी प्रकार, कोई एल्गोरिदम नहीं है जो यह निर्धारित कर सकता है कि फ़ंक्शन x फ़ंक्शन वाई कॉल करेगा या नहीं, या कोड की एक निश्चित पंक्ति निष्पादित होगी, आदि। स्पष्ट रूप से कुछ प्रोग्रामों के लिए कोई इन व्यवहारों को निर्धारित कर सकता है। उदाहरण के लिए, एक प्रिंट स्टेटमेंट वाला एक 1 लाइन प्रोग्राम एक पंक्ति को निष्पादित करेगा और बाहर निकलेंगा। लेकिन मनमाने ढंग से कार्यक्रम मनमाने ढंग से जटिल हो सकते हैं, इसलिए यह साबित किया जा सकता है कि मनमाने ढंग से कार्यक्रम के लिए इन व्यवहारों को निर्धारित करने के लिए कोई एल्गोरिदम मौजूद नहीं है। दुर्भाग्यवश, आपको इस समस्या को हल करने के लिए प्रोग्राम चलाने में सक्षम होना चाहिए।

+1

लेकिन आप सभी संभावित कॉल की जगह की पहली चौड़ाई खोज कर सकते हैं। उपयोगकर्ता कुछ ग्राफ पर निर्माण को रोक सकता है बिंदु, और कार्यक्रम "बहुत मुश्किल" कहते हैं। – codeshot

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