2009-05-29 19 views
11

Hey acaba ... Ben Tutulma ile Pydev kullanıyorum ve gerçekten güçlü hata ayıklama özelliklerini zevk alıyorum, ama ben merak ediyorum:Python Etkileşimli Oturumu orta programa atlayın?

mümkün mü Tutulma bir kesme noktası ayarlamak ve içine atlamak yürütme sırasında etkileşimli python yorumlayıcısı? Ben amacım bir ayıklayıcıya atlamak olmadığını vurgulamak istiyorum:

düzenlemek);

Bu oldukça kullanışlı olacağını düşünüyorum. pydev/eclipse harika bir hata ayıklayıcısına sahip ve sadece geri izlemeye bakıp mola noktaları belirleyebilirim. Benim istediğim

  • manipüle etrafında
  • kontrol ediniz şeylerin değerlerini karıştırmak ...

    • bir komut dosyası yürütmek ve ben gibi şeyler yapabilmeniz için yürütme sırasında interaktif bir piton tercüman içine atlamak etmektir değişkenler
    • rakam dışarı ben

    Hepinizin zekâ yapabilirsiniz biliyorum uygulamanıza ekleyin önce bazı kod Bir hata ayıklayıcı, ancak ben etkileşimli yorumlayıcıda daha hızlı yapabilirim, çünkü bir şey deneyebilirim, işe yaramadığını görüyorum ve uygulamayı tekrar bu kodu yürütme noktasına geri dönmeden başka bir şey deneyebilirsiniz. Zaten ayıklama modunda çalışıyorsa program yürütme duraklatılmış ise (bir kesme noktasında zaten çünkü mesela)

  • +0

    Vurguya gerek yok - yeniden biçimlendirmeyi düşünün mü? –

    cevap

    8

    yılda andan itibaren OP'nin sorusu, PyDev'in bu yeteneği var. Bu özellik kullanıma girdiğinden emin değilim, ama tek bildiğim son ~ 2hrs Googling'i geçirdim ... iPython'u ve ne yaparsak onu yapılandırmak (ki böyle bir şey olurdu) iş), ancak Eclipse/PyDev'in sadece ootb istediğimi gerçekleştirdiğinin farkına varmak.

    Hata ayıklama modunda bir kesme noktasına ulaşır vurmaz, konsol hazır ve beklemede! Sadece uyarı veya yanıp sönen bir imleç olmadığı için bunu fark etmedim; Yanlışlıkla standart, sadece çıkışlı bir konsol olduğunu varsaydım ... ama değil. Hatta kod tamamlama özelliği vardır.

    Harika şeyler, daha fazla ayrıntı için bkz http://pydev.org/manual_adv_debug_console.html.

    +0

    vay ... harika bul :) – Jiaaro

    +0

    Evet ve hatta Apache + mod_wsgi yığınında (veya başka bir üretim kurulumunda) kullanabilirsiniz. Ancak etkileşimli konsolun çalıştığından emin olmak için aşağıdaki gibi başlatmanız gerekir: "pydevsrc import pydevd" den pydevd.settrace ('', stdoutToServer = True, stderrToServer = True) ' –

    -2

    ek bir kesme noktası ayarlayabilirsiniz. En son Pydev ile şimdi denedim - gayet iyi çalışıyor. Eğer (yani değil ayıklama modunda) normal çalışıyorsa

    Tüm kırılma noktalarını göz ardı edilecektir. Kesme noktalarında hiçbir değişiklik, hata ayıklamayan bir çalışmanın çalışma şeklini değiştirmez.

    2

    Uzun bir istisna ile ilgili bir hata ayıklayıcı başlatmak için benim sitecustomize.py bu kodu kullanıyorum. Bu da Ctrl + C tarafından tetiklenebilir. Kabuğun içinde güzelce çalışıyor, tutulmayı bilmiyor.

    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 
    

    İşte source ve more discussion on StackOverflow bu.

    2
    Sen here açıklandığı gibi code.InteractiveConsole kullanılarak interaktif bir oturum içine atlayabilir

    ; Ancak bunu Eclipse'den nasıl tetikleyeceğimi bilmiyorum.

    solüsyonu (signal modülü kullanarak: signal.signal(signal.SIGINT, my_handler)) bu interaktif konsola içine atlamak için Ctrl + C yolunu kesmek için olabilir, ama muhtemelen yürütme içeriği değiştirecek ve muhtemelen bu istemezsiniz.

    1

    ipython için sorunuza bir cevap, ama sadece bir işaretçi gerçekten değil. Sadece farkında olmasanız bile. Ben sadece böyle şeyler için eclipse/pydev ile yan yana kullanın. relevence Of

    kendi uygulamanıza iPython gömme hakkında bu bilgileri olduğunu. Bu, eclipse/pydev'in dışında yapmaya istekli iseniz, aradığınız şeyi yapma olanağı sağlar.

    6

    Bu eski bir projeden geliyor ve ben yazmamıştım, ancak ipython'u kullanmak istediğinize benzer bir şey yapıyor. Jim Robert (soru sahibi) tarafından

    '''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) 
    

    düzenleme: Eğer bir dosyaya yukarıdaki kodu yerleştirirseniz bu örnekte uğruna my_debug.py aradı. Sonra piton yolu bu dosyayı yerleştirin ve (bir kabuktan yürütme sürece) bir hata ayıklayıcı içine atlamak için kodunuzda herhangi bir yere aşağıdaki satırları ekleyebilirsiniz: Yani kabaca

    import my_debug 
    my_debug.db() 
    
    İlgili konular