2009-04-07 11 views
8

Anlattığım gibi, pdb kaynak kodu "çalışır" arasında değiştiğinde tanımadı. Yani, hata ayıklaması yaparsam, bir hata farkedersiniz, bu hatayı düzeltin ve programı pdb'de yeniden çalıştırın (yani pdb'den çıkmadan), pdb kodu yeniden derlemez. Pdb yeni kaynak kodunu listelese bile, kodun eski sürümünü ayıklamaya devam edeceğim.pdb, kaynağın çalışma arasında değiştiğini nasıl anlar?

Yani, pdb kaynak değiştikçe derlenen kod güncelleme değildir? Değilse, bunu yapmanın bir yolu var mı? Ayrılıklarımı ve benzerlerini korumak için tek bir pdb oturumunda kalmak istiyorum. Sadece bu program tekrar başlatıldığında üzerinde olsa program, bunun altında değişiklikleri ayıklama ne zaman

FWIW, gdb göreceksiniz. Bu, pdb'de çoğaltmaya çalıştığım davranış. Eğer demek istiyorsunuz ne

cevap

2

"pdb programını yeniden çalıştırın?" Bir modülü içe aktardıysanız, Python bunu açıkça istemediğiniz sürece, yani reload(module) ile tekrar okuyamaz. Ancak, reload, kurşun geçirmez olmaktan uzaktır (başka bir strateji için bkz. xreload).

Python kodu tekrar yükleme tuzaklar bol vardır. Sorununuzu daha güçlü bir şekilde çözmek için, pdb'yi kesme noktası bilgilerinizi diskteki bir dosyaya kaydeden bir sınıfla örtebilir ve bunları yeniden komut üzerinde çalabilirsiniz.

(Maalesef bu cevabın ilk sürümünü görmezden; daha erken ve ben yeterince dikkatli sorunuzu okumadım.) Aşağıdaki mini modül yardımcı olabilir

+0

Komut satırı. pdb programımın çıktığı fikrini açıkça anlıyor, bu yüzden merak ediyorum, programım ikinci kez çalıştığında, gerekirse kaynağı yeniden derleyebilirse. – user88028

+0

Yeniden çalışmaya başlamadan önce pdb içinden 'reload' kullanmayı deneyebilirsiniz, ancak yine programınızın yapısına bağlı olarak güvenilir olmayabilir. (FWIW, bir dil olarak bu Python tek büyük başarısızlığı dikkate Smalltalk ve Lisp gibi ortamlardan geliyor, bu sadece karartıcı..) –

+0

Ben piton delgi debugger'lar bir komutla (trepan3k https olarak xreload dahil etmek istiyoruz @NicholasRiley: //pypi.python.org/pypi/trepan3k ve trepan2 https://pypi.python.org/pypi/trepan2). Bunlar GPL3. Bu iyi mi? Yazar mısınız? Ben pdb.r() çalıştırdığınızda – rocky

3

. Eğer Pdb oturumda içe, o zaman kullanabilirsiniz:

pdb> pdbs.r() 

her an ana hariç tüm sistem dışı modülleri zorla yeniden. Kod, bir ImportError ('ana ana modülünü yeniden başlatılamıyor' istisnası) attığından bunu atlar.

# pdbs.py - PDB support 

from __future__ import print_function 

def r(): 
    """Reload all non-system modules, so a pdb restart 
    will reload anything new 
    """ 
    import sys 
    # This is likely to be OS-specific 
    SYS_PREFIX = '/usr/lib' 

    for k, v in sys.modules.items(): 
     if not hasattr(v, '__file__'): 
      continue 
     if v.__file__.startswith(SYS_PREFIX): 
      continue 
     if k == '__main__': 
      continue 
     print('reloading %s [%s]' % (k, v.__file__)) 
     reload(v) 
+0

, alıyorum: *** AttributeError: 'dict' nesne hiçbir özellik 'iteritems' – Chelmite

+0

My özür var - .iteritems() Python 3.x ile uyumlu değildir Kodu değiştirmesi için çalışmam gerekiyor. – pourhaus

0

uzatma %autoreload ipdb

6.2.0 docs belge http://ipython.readthedocs.io/en/stable/config/extensions/autoreload.html#module-IPython.extensions.autoreload:

Ben bir piton programını çalıştırarak ne anlama geldiğini, kavramsal olarak, bir "yeniden gösterme" kastım
In [1]: %load_ext autoreload 

In [2]: %autoreload 2 

In [3]: from foo import some_function 

In [4]: some_function() 
Out[4]: 42 

In [5]: # open foo.py in an editor and change some_function to return 43 

In [6]: some_function() 
Out[6]: 43 
İlgili konular