2009-05-29 12 views
11

अरे मैं सोच रहा था ... मैं ग्रहण के साथ Pydev उपयोग कर रहा हूँ और मैं वास्तव में शक्तिशाली डिबगिंग सुविधाओं का आनंद ले रहा हूँ, लेकिन मैं सोच रहा था:एक पायथन इंटरएक्टिव सत्र मध्य कार्यक्रम में कूदें?

यह संभव है ग्रहण में एक ब्रेकपाइंट सेट और में कूदने के लिए निष्पादन के दौरान इंटरैक्टिव पायथन दुभाषिया?

मुझे लगता है कि बहुत आसान हो सकता है;)

संपादित: मैं जोर देना है कि मेरा लक्ष्य एक डिबगर में कूदने के लिए नहीं है चाहता हूँ। pydev/ग्रहण में एक महान डीबगर है, और मैं सिर्फ ट्रेसबैक देख सकता हूं और ब्रेक पॉइंट सेट कर सकता हूं।

मैं क्या चाहता हूँ एक स्क्रिप्ट निष्पादित और निष्पादन के दौरान एक इंटरैक्टिव अजगर दुभाषिया में कूद तो मैं जैसे काम कर सकें करने के लिए ...

  • प्रहार के आसपास
  • जांच चीजों के मूल्यों
  • हेरफेर है चर
  • आंकड़ा बाहर कुछ कोड इससे पहले कि मैं यह एप्लिकेशन

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

+0

जोर देने की कोई आवश्यकता नहीं - फिर से स्वरूपण पर विचार करें? –

उत्तर

8

तो मोटे तौर पर एक साल: तो फिर अपने अजगर रास्ते में है कि फ़ाइल, और आप एक डीबगर में कूदने के लिए अपने कोड में कहीं भी निम्नलिखित लाइनों सम्मिलित कर सकते हैं (जब तक आप एक खोल से निष्पादित) ओपी का सवाल, पीईडीव में इस क्षमता का निर्माण किया गया है। मुझे यकीन नहीं है कि यह सुविधा कब पेश की गई थी, लेकिन मुझे पता है कि मैंने आखिरी ~ 2 घंटे गुगलिंग बिताई है ... iPython को कॉन्फ़िगर करना और जो भी (जैसा दिख रहा था नौकरी), लेकिन केवल ग्रहण/पायडेव का एहसास करने के लिए मुझे ओटब चाहिए।

जैसे ही आप डीबग मोड में ब्रेकपॉइंट मारा, कंसोल ठीक है और इंतज़ार कर रहा है! मैंने केवल यह नहीं देखा क्योंकि कोई प्रॉम्प्ट या ब्लिंकिंग कर्सर नहीं है; मैंने गलत तरीके से माना था कि यह एक मानक, आउटपुट-केवल, कंसोल था ... लेकिन ऐसा नहीं है। इसमें कोड-पूर्णता भी है।

ग्रेट सामान, http://pydev.org/manual_adv_debug_console.html अधिक जानकारी के लिए देखें।

+0

वाह ... महान खोज :) – Jiaaro

+0

हाँ और आप इसे अपाचे + mod_wsgi स्टैक (या अन्य उत्पादन सेटअप) पर भी उपयोग कर सकते हैं। हालांकि यह सुनिश्चित करने के लिए कि इंटरैक्टिव कंसोल काम करता है, आपको इसे इस तरह लॉन्च करना होगा: 'pydevsrc आयात pydevd से; pydevd.settrace (' ', stdoutToServer = True, stderrToServer = True) ' –

-2

आप पहले से ही डिबग मोड में चला रहे हैं तो आप एक अतिरिक्त ब्रेकपाइंट (जैसे, क्योंकि आप एक ब्रेकप्वाइंट पर पहले से ही कर रहे हैं) सेट कर सकते हैं, तो प्रोग्राम निष्पादन अभी रुका हुआ है। मैंने अभी हालिया पायदेव के साथ इसे आजमाया - यह ठीक काम करता है।

यदि आप सामान्य रूप से चल रहे हैं (यानी डीबग मोड में नहीं) तो सभी ब्रेकपॉइंट्स को अनदेखा कर दिया जाएगा। ब्रेकपॉइंट्स में कोई भी बदलाव गैर-डीबग रन काम करने के तरीके को बदल देगा।

2

मैं लंबे समय से मेरी sitecustomize.py में इस कोड का उपयोग किया गया है एक अपवाद पर एक डिबगर शुरू करने के लिए। इसे Ctrl + C द्वारा भी ट्रिगर किया जा सकता है। यह खोल में खूबसूरती से काम करता है, ग्रहण के बारे में पता नहीं है।

import sys 

def info(exception_type, value, tb): 
    if hasattr(sys, 'ps1') or not sys.stderr.isatty() or not sys.stdin.isatty() or not sys.stdout.isatty() or type==SyntaxError: 
     # we are in interactive mode or we don't have a tty-like 
     # device, so we call the default hook 
     sys.__excepthook__(exception_type, value, tb) 
    else: 
     import traceback 
     import pdb 


     if exception_type != KeyboardInterrupt: 
      try: 
       import growlnotify 
       growlnotify.growlNotify("Script crashed", sticky = False) 
      except ImportError: 
       pass 

     # we are NOT in interactive mode, print the exception... 
     traceback.print_exception(exception_type, value, tb) 
     print 
     # ...then start the debugger in post-mortem mode. 
     pdb.pm() 

sys.excepthook = info 

यहाँ source और more discussion on StackOverflow है।

2

आप एक इंटरैक्टिव सत्र के रूप में वर्णित herecode.InteractiveConsole का उपयोग कर में कूद कर सकते हैं; हालांकि मुझे नहीं पता कि ग्रहण से इसे कैसे ट्रिगर करें।

एक समाधान इस इंटरैक्टिव कंसोल में कूदने के लिए Ctrl + C को अवरुद्ध करने के लिए हो सकता है (signal मॉड्यूल: signal.signal(signal.SIGINT, my_handler) का उपयोग करके), लेकिन शायद यह निष्पादन संदर्भ बदल देगा और शायद आपको यह नहीं चाहिए।

1

आपके प्रश्न का कोई जवाब नहीं है, लेकिन केवल iPython के लिए एक सूचक है। बस अगर आपको इसके बारे में पता नहीं है। मैं इस तरह की चीजों के लिए ग्रहण/pydev के साथ साइड-बाय-साइड का उपयोग करता हूं।

प्रासंगिकता के

अपनी ऐप्लिकेशन में iPython एम्बेड करने पर यह जानकारी है। यह आप जो खोज रहे हैं उसे करने की क्षमता प्रदान करता है यदि आप इसे ग्रहण/pydev के बाहर करने के इच्छुक हैं।

6

यह एक पुरानी परियोजना से है, और मैंने इसे नहीं लिखा है, लेकिन यह कुछ ऐसा करता है जो आप ipython का उपयोग करना चाहते हैं।

'''Start an IPython shell (for debugging) with current environment.      
Runs Call db() to start a shell, e.g.             


def foo(bar):                   
    for x in bar:                  
     if baz(x):                  
      import ipydb; ipydb.db() # <-- start IPython here, with current value of x (ipydb is the name of this module). 
.                      
''' 
import inspect,IPython 

def db(): 
    '''Start IPython shell with callers environment.''' 
    # find callers                  
    __up_frame = inspect.currentframe().f_back 
    eval('IPython.Shell.IPShellEmbed([])()', # Empty list arg is      
     # ipythons argv later args to dict take precedence, so       
     # f_globals() shadows globals(). Need globals() for IPython     
     # module.                  
     dict(globals().items() + __up_frame.f_globals.items()), 
     __up_frame.f_locals) 

संपादित जिम रॉबर्ट (प्रश्न मालिक) द्वारा: यदि आप एक फाइल में उपरोक्त कोड जगह यदि इस उदाहरण के लिए my_debug.py कहा जाता है। से पर

import my_debug 
my_debug.db() 
संबंधित मुद्दे