Soru Koddan ipython'a gitmek mümkün mü?


Hata ayıklama ihtiyaçlarım için pdb oldukça iyi. Ancak, olurdu çok daha serin (ve yararlı) eğer gidebilirsem ipython. Bu şey mümkün mü?


76
2017-07-14 17:45


Menşei




Cevaplar:


Bir var ipdb iPython'u standart pdb'ye yerleştiren proje, böylece sadece şunları yapabilirsiniz:

import ipdb; ipdb.set_trace()

Her zamanki gibi kurulabilir pip install ipdb.

ipdb oldukça kısa, bu yüzden easy_installing yerine bir dosya da oluşturabilirsiniz ipdb.py Python yolunuzda bir yere koyun ve aşağıdakileri dosyaya yapıştırın:

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)

106
2017-07-14 18:18



Korku veren! Bu çok havalı! - Geo
Django ile inanılmaz iyi çalışır. 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). - Xiong Chiamiov
Aslında, sorun şu ki, Django, koşucu için ayrı bir iş parçacığı sorar ve bir kod düzenlemeyi yaptığınız her zaman, 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. - Jeremy Dunck
@ daniel-roseman Merhaba, anladım ModuleNotFoundError: No module named 'IPython.Debugger', ModuleNotFoundError: No module named 'IPython.Shell' ve ImportError: cannot import name 'ipapi' - SebMa
@memoselyk Merhaba, anladım ModuleNotFoundError: No module named 'IPython.Debugger', ModuleNotFoundError: No module named 'IPython.Shell' ve ImportError: cannot import name 'ipapi' - SebMa


IPython 0.11'de, IPython'u doğrudan kodunuza gömebilirsiniz

Programın buna benzeyebilir

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

Bunu çalıştırdığınızda ne olur (ben keyfi bir şekilde mevcut bir ipython oturumu içinde çalıştırmayı seçtim. Benim deneyimimde bunun gibi ipython oturumlarını yerleştirmek çökmesine sebep 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

49
2017-09-14 05:00



Bu bir IPython oturumuna düşmek çok güzel. Çok teşekkür ederim! - joon
Bunu (neredeyse sonsuz) bir döngü içine aptalca yerleştirdim. Nasıl dışarı çıkarım ki? - gerrit
@gerrit, hala oradaysanız Ctrl + d tuşlarına basın. - confused00
@ confused00 Bu, 6 ay sonra sonsuza kadar sonsuz olurdu ;-) - gerrit
Bunun bir avantajı bitti pdb ve ipdb Çalıştırdığınız kodun neden olduğu istisnalar, tam geri dönüşler almanızdır (çünkü zaten "bir" değilsiniz). Bu benim için çok kullanışlıdır, çünkü kullanmak için bir eğilimim var pdbEtkileşimli bir kabuk için bir grup değişken oluşturmanın bir yolu olarak. - Xiong Chiamiov


Eşdeğeri

import pdb; pdb.set_trace()

IPython ile bir şey gibi:

from IPython.ipapi import make_session; make_session()
from IPython.Debugger import Pdb; Pdb().set_trace()

Bu biraz verbose, ancak ipdb'nin yüklü olup olmadığını bilmek güzel. make_session renk şemasını, vb. ayarlamak için bir kez set_trace aramanız gereken her yere yerleştirilebilir.


11
2017-07-15 00:40





IPython'un (> 0.10.2) daha modern bir sürümünü kullanıyorsanız,

from IPython.core.debugger import Pdb
Pdb().set_trace()

Ama sadece ipdb kullanmak daha iyidir


11
2017-09-21 10:41





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

Sonra betiğimin 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. Sihirli ipython komutları için yardım komutuna bakın (% büyü)


8
2017-07-14 18:08



yani ipython.set_trace () gibi bir şey yazmanın yolu yok mu? :) - Geo


Bu tek liner'ı, bir kesme noktası ayarlamak istediğim komut dosyalarına yapıştırmayı seviyorum:

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

Daha yeni sürüm şunları kullanabilir:

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

8
2017-08-29 11:58





Modüllerin yakın zamanda biraz karıştırılmış gibi görünüyor. IPython 0.13.1'de aşağıdaki işler benim için

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

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

Her ne kadar alas, her şey güzel qtconsole'de değersiz.


6
2018-01-22 17:43