2009-07-14 16 views

cevap

104

standart pdb içine ipython gömen bir ipdb proje var, yani tıpkı yapabilirsiniz: zamanki pip install ipdb aracılığıyla

import ipdb; ipdb.set_trace() 

Bu yüklenebilir bu.

ipdb oldukça kısa, bu yüzden yerine siz de Python yolda bir yerlerde bir dosya ipdb.py oluşturup dosyasına aşağıdaki yapıştırabilirsiniz easy_installing geçerli:

import sys 
from IPython.Debugger import Pdb 
from IPython.Shell import IPShell 
from IPython import ipapi 

shell = IPShell(argv=['']) 

def set_trace(): 
    ip = ipapi.get() 
    def_colors = ip.options.colors 
    Pdb(def_colors).set_trace(sys._getframe().f_back) 
+2

Harika! Bu çok havalı! – Geo

+0

Django ile inanılmaz iyi çalışıyor. Peki, yazdığım yazıyı göremediğimden başka bir şey de olmasa da, muhtemelen kolay bir şekilde çözülebilir (ipdb'nin sadece altı satırından beri). –

+4

Aslında, sorun şu ki, Django, runserver için ayrı bir iş parçacığı istediğini ve herhangi bir kod düzenleme yaptığınızda, bu iş parçacığını yeniden gönderir. Bu normal olarak iyi çalışır, ancak iş parçacığı öldüğünde pdb içinde oturuyorsanız, terminal çıldırır. Bunu runserver, runniny 'stty sane' den ayırarak, daha sonra runserver'ı yeniden başlatarak düzeltebilirsiniz. –

8

Normalde, ipython'u kullandığımda, otomatik hata ayıklamayı "pdb" komutuyla açarım.

Komut dizininin bulunduğu dizindeki "run myscript.py" komutunu kullanarak komutumu çalıştırıyorum.

Bir istisna alırsam, ipython programı hata ayıklayıcının içinde durdurur. IPython docs itibaren komutları ipython büyü (% büyü)

+0

böylece ipython.set_trace gibi bir şey yazma yolu yoktur içine()? :) – Geo

3

için help komutunu göz atın:

import IPython.ipapi 
namespace = dict(
    kissa = 15, 
    koira = 16) 
IPython.ipapi.launch_new_instance(namespace) 

programlı bir ipython kabuğunu başlatacak. Açıkça namespace dict değerleri sadece kukla değerlerdir - pratikte locals()'u kullanmak daha mantıklı olabilir.

Bu belgede kod yazmanız gerektiğini unutmayın; pdb'un yaptığı gibi çalışmayacak. Eğer istediğin buysa, DoxaLogos'un cevabı muhtemelen senin aradığın gibi.

11

import pdb; pdb.set_trace() 

eşdeğer IPython ile bir şey gibi:

Bu biraz ayrıntılı, ancak ipdb'nin yüklü olup olmadığını bilmek güzel. Renk şemasını ayarlamak için bir kez make_session çağrısı gereklidir ve kırılması gereken her yere set_trace çağrıları yerleştirebilirsiniz.

3

kolay hızlı ve yönlü: Eğer programı hata ayıklama başlatmak istediğiniz yere

from IPython.Debugger import Tracer 
debug = Tracer() 

Sonra sadece

debug() 

yazın.

+1

'ImportError: Python'da 'IPython.Debugger' adında bir modül yok 3.4/IPython 3 – ostrokach

47

IPython'da 0.11 Eğer Programınız bu

In [5]: cat > tmpf.py 
a = 1 

from IPython import embed 
embed() # drop into an IPython session. 
     # Any variables you define or modify here 
     # will not affect program execution 

c = 2 

^D 

Bu çalıştırmak böyle olur gibi görünebilir bu

gibi doğrudan kodunuzda IPython gömebilirsiniz (Ben keyfi varolan ipython oturumu içinde çalıştırmak için seçti. Benim deneyimimde böyle ipython oturumları yerleştirmek çökmesine neden olabilir).

In [6]: 

In [6]: run tmpf.py 
Python 2.7.2 (default, Aug 25 2011, 00:06:33) 
Type "copyright", "credits" or "license" for more information. 

IPython 0.11 -- An enhanced Interactive Python. 
?   -> Introduction and overview of IPython's features. 
%quickref -> Quick reference. 
help  -> Python's own help system. 
object? -> Details about 'object', use 'object??' for extra details. 

In [1]: who 
a  embed 

In [2]: a 
Out[2]: 1 

In [3]: 
Do you really want to exit ([y]/n)? y 


In [7]: who 
a  c  embed 
+0

Bir IPython oturumuna girmeniz çok güzel. Çok teşekkür ederim! – joon

+1

Bunu (neredeyse sonsuz) bir döngü içine aptalca yerleştirdim. Nasıl dışarı çıkarım ki? – gerrit

+2

@gerrit, hala oradaysanız Ctrl + d tuşlarına basın. – confused00

7
Ben sadece bir kesme noktası ayarlamak istediğiniz script'lerime bu tek astar yapıştırmak istediğiniz

:

__import__('IPython').Debugger.Pdb(color_scheme='Linux').set_trace() 

Yeni sürüm kullanabilirsiniz: iseniz

__import__('IPython').core.debugger.Pdb(color_scheme='Linux').set_trace() 
11

IPython'un daha modern bir versiyonunu kullanarak (> 0.10.2),

Ancak, muhtemelen sadece ipdb kullanmanız daha iyi olur.

6

Modüllerin son zamanlarda biraz karıştırılması gibi görünüyor. Beni

from IPython.core.debugger import Tracer; breakpoint = Tracer() 

breakpoint() # <= wherever you want to set the breakpoint 

rağmen ne yazık ki, tüm oldukça worthless in qtconsole var için ipython 0.13.1 aşağıdaki işleri üzerinde.

4

IPython'un daha yeni sürümleri, IPython oturumlarını herhangi bir Python programına yerleştirmek ve yerleştirmek için kolay bir mekanizma sağlar. IPython oturumları gömmek için the following recipe izleyebilir: Bir ipython kabuğuna damla istediğinizde

try: 
    get_ipython 
except NameError: 
    banner=exit_msg='' 
else: 
    banner = '*** Nested interpreter ***' 
    exit_msg = '*** Back in main IPython ***' 

# First import the embed function 
from IPython.frontend.terminal.embed import InteractiveShellEmbed 
# Now create the IPython shell instance. Put ipshell() anywhere in your code 
# where you want it to open. 
ipshell = InteractiveShellEmbed(banner1=banner, exit_msg=exit_msg) 

Sonra ipshell() kullanın. Bu, kodunuzdaki IPython yorumlayıcılarını gömmenize (ve hatta yerleştirmenize) olanak tanır.

2

Birkaç güne kaç kez cevap eklediğimi google'a bir çift gondirdim ... bazen bir betiği normal bir şekilde çalıştırabildiğim için ve sadece ipdb.set_trace() kesme noktasını koymak zorunda kalmadan hatalar üzerine ipython/ipdb içine düşebiliyorum kod

ipython --pdb -c "%run path/to/my/script.py --with-args here" 

(kursun ilk pip install ipython ve pip install ipdb)

+1

Teşekkürler! Biraz daha basit: 'ipython --pdb - ./path/to/my/script --with-args here' – alisianoi