2008-12-02 6 views
16

क्या पाइथन कोड के भीतर, यह पता लगाने का कोई आसान तरीका है कि यह कोड पायथन डीबगर के माध्यम से निष्पादित किया जा रहा है?यह पता लगाने के लिए कि पाइथन कोड डीबगर के माध्यम से निष्पादित किया जा रहा है?

मेरे पास एक छोटा पायथन एप्लिकेशन है जो जावा कोड का उपयोग करता है (जेपी टाइप के लिए धन्यवाद)। जब मैं पायथन भाग को डिबग कर रहा हूं, तो मैं एम्बेडेड जेवीएम को डीबग विकल्प भी देना चाहता हूं।

उत्तर

10

अजगर 2.4 के साथ काम कर एक समाधान और Pydev (यह 2.1 से बेहतर किसी भी संस्करण के साथ काम करना चाहिए):

import inspect 

def isdebugging(): 
    for frame in inspect.stack(): 
    if frame[1].endswith("pydevd.py"): 
     return True 
    return False 

एक ही बस pdb.py साथ pydevd.py की जगह pdb साथ काम करना चाहिए। जैसा कि डू 3 सीसी ने सुझाव दिया है, यह कॉलर के ढेर के भीतर डीबगर खोजने की कोशिश करता है।

उपयोगी लिंक्स:

2

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

$ USING_PDB=1 pdb yourprog.py 
फिर yourprog.py में

:

import os 
if os.environ.get('USING_PDB'): 
    # debugging actions 
    pass 
17

अजगर डिबगर (और साथ ही प्रोफाइलर और कवरेज उपकरण) (sys मॉड्यूल में) sys.settrace फ़ंक्शन का उपयोग एक कॉलबैक रजिस्टर करने के लिए है कि जब दिलचस्प बुलाया जाता है घटनाएं होती हैं।

यदि आप पायथन 2.6 का उपयोग कर रहे हैं, तो आप वर्तमान ट्रेस कॉलबैक फ़ंक्शन प्राप्त करने के लिए sys.gettrace() पर कॉल कर सकते हैं। यदि यह None नहीं है तो आप मान सकते हैं कि आपको जेवीएम में डीबग पैरामीटर पास करना चाहिए।

यह स्पष्ट नहीं है कि आप यह पूर्व 2.6 कैसे कर सकते हैं।

+1

हालांकि यह एक क्लीनर तरीका प्रतीत हो रहा है, यह pdb में काम नहीं करता है, तो वहाँ कोई ब्रेकपाइंट सेट है। – apoorvkul

+0

हम्म, आप सही हैं - यह डीबगर उपयोग का अनुकूलन होना चाहिए। उस ने कहा, ज्यादातर समय जब आप डीबगर में चल रहे हों तो आपके पास ब्रेकपॉइंट सेट होगा। – babbageclunk

1

आप अपने स्टैकट्रैक में देखने की कोशिश कर सकते हैं।

https://docs.python.org/library/inspect.html#the-interpreter-stack

आप एक डिबगर सत्र में इस प्रयास करते हुए:

import inspect 
inspect.getouterframes(inspect.currentframe() 

आप framerecords की एक सूची मिल जाएगा और किसी भी फ्रेम कि pdb फ़ाइल को संदर्भित के लिए झांक सकते कर सकते हैं।

3

आप Pydev का उपयोग कर रहे हैं, तो आप यह इस तरह से पता लगा सकते हैं:

import sys 
if 'pydevd' in sys.modules: 
    print "Debugger" 
else: 
    print "commandline" 
5

करने के लिए एक और तरीका है यह आपके पायथन दुभाषिया को कैसे शुरू किया जाता है इस पर निर्भर करता है। इसके लिए आपको उत्पादन के लिए पायदान और डीबगिंग के लिए नो-ओ के साथ पायथन शुरू करना आवश्यक है। इसलिए इसे बाहरी अनुशासन की आवश्यकता होती है जो बनाए रखना मुश्किल हो सकता है .. लेकिन फिर यह आपकी प्रक्रियाओं को पूरी तरह से फिट कर सकता है।

अजगर डॉक्स से (देखें "निर्मित स्थिरांक" here या here):

__debug__ 
This constant is true if Python was not started with an -O option. 

प्रयोग की तरह कुछ होगा:

if __debug__: 
    print 'Python started without optimization' 
2

मैं यह करने के एक क्लीनर रास्ता मिल गया,

बस अपने manage.py

में निम्नलिखित पंक्ति जोड़ 210
#!/usr/bin/env python 
import os 
import sys 

if __debug__: 
    sys.path.append('/path/to/views.py') 


if __name__ == "__main__": 
    .... 

फिर जब आप डिबगिंग करते हैं तो यह स्वचालित रूप से इसे जोड़ देगा।

5

अन्य विकल्प आप Pydev कि यह भी एक बहु सूत्रण में काम करता है उपयोग कर रहे हैं यह है:

try: 
    import pydevd 
    DEBUGGING = True 
except ImportError: 
    DEBUGGING = False 
संबंधित मुद्दे

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