Koddan ipython'a girmek mümkün mü?


81

Hata ayıklama ihtiyaçlarım pdbiçin oldukça iyi. Ancak, girebilseydim çok daha havalı (ve faydalı) olurdu ipython. Bu mümkün mü?

Yanıtlar:


112

ipdbİPython'u standart pdb'ye yerleştiren bir proje var, yani şunları yapabilirsiniz:

import ipdb; ipdb.set_trace()

Her zamanki gibi kurulabilir pip install ipdb.

ipdboldukça kısadır, bu nedenle easy_installing yerine ipdb.pyPython yolunuzda bir yerde bir dosya oluşturabilir ve aşağıdakini dosyaya yapıştırabilirsiniz:

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)

Django ile inanılmaz derecede iyi çalışıyor. Yazdığım metni görememem dışında, ama bu muhtemelen kolayca düzeltilebilir (çünkü ipdb sadece altı satırdır).
Xiong Chiamiov

4
Aslında sorun, Django'nun çalıştırma sunucusu için ayrı bir iş parçacığı çatallaması ve her kod düzenlemesi yaptığınızda iş parçacığını yeniden canlandırmasıdır. Bu normalde iyi çalışır, ancak iş parçacığı öldürüldüğünde pdb'de oturuyorsanız, terminal delirir. Bunu, runserver'dan çıkarak, runniny 'stty sane' ile ve ardından runserver'ı yeniden başlatarak düzeltebilirsiniz.
Jeremy Dunck

1
@ daniel-Roseman Merhaba, olsun ModuleNotFoundError: No module named 'IPython.Debugger', ModuleNotFoundError: No module named 'IPython.Shell'veImportError: cannot import name 'ipapi'
SebMa

1
Merhaba @memoselyk, benim hemen ModuleNotFoundError: No module named 'IPython.Debugger', ModuleNotFoundError: No module named 'IPython.Shell'veImportError: cannot import name 'ipapi'
SebMa

Almanın bir yolu yoktur breakpoint()ipdb içine almak için işlevini.
gerrit

53

IPython 0.11'de, IPython'u bu şekilde doğrudan kodunuza yerleştirebilirsiniz

Programınız şöyle görünebilir

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

Çalıştırdığınızda olan budur (keyfi olarak mevcut bir ipython oturumunda çalıştırmayı seçtim. Deneyimlerime göre ipython oturumlarını bu şekilde 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

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

1
Bunu aptalca (neredeyse sonsuz) bir döngünün içine yerleştirdim. Nasıl dışarı çıkabilirim?
gerrit

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

2
@ confused00 6 ay sonra çok sonsuz olurdu ;-)
gerrit

1
@gerrit, bir gömme sürekli tekrarlanması durumunda: def f() : pass ; IPython.embed = fböylece embed()çağrı bir noop, sonra Ctrl + D
MatrixManAtYrService

12

IPython'un daha modern bir sürümünü kullanıyorsanız (> 0.10.2), aşağıdaki gibi bir şey kullanabilirsiniz:

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

Ama muhtemelen sadece ipdb kullanmak daha iyidir


11

Eşdeğeri

import pdb; pdb.set_trace()

IPython ile şuna benzer:

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

Biraz ayrıntılı, ancak ipdb'nin kurulu olup olmadığını bilmek güzel. make_sessionVs, renk düzeni kurmak için bir kez çağrı gereklidir ve set_traceçağrılar yerleştirilebilir her yerde kırmaya gerek yoktur.


8

Normalde ipython kullandığımda, içindeki "pdb" komutu ile otomatik hata ayıklamayı açıyorum.

Daha sonra betiğimi, betiğimin bulunduğu dizinde "çalıştır myscript.py" komutuyla çalıştırıyorum.

Bir istisna alırsam, ipython programı hata ayıklayıcı içinde durdurur. Sihirli ipython komutları için yardım komutuna bakın (% büyü)


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

8

Bu tek satırlık yazıyı komut dosyalarıma, kesme noktası ayarlamak istediğim yere 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()

6

Görünüşe göre modüller son zamanlarda biraz karıştırılmış. IPython 0.13.1'de aşağıdakiler benim için çalışıyor

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

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

Ne yazık ki, qtconsole'da hepsi oldukça değersiz .


5

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ını gömmek için aşağıdaki tarifi takip edebilirsiniz :

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)

Daha sonra ipshell()bir IPython kabuğuna bırakmak istediğinizde kullanın. Bu, kodunuza IPython yorumlayıcıları yerleştirmenize (ve hatta iç içe yerleştirmenize) izin verecektir.


3

Gönderen ipython docs :

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

programlı olarak bir IPython kabuğu başlatır. Açıktır ki, namespacediktteki değerler sadece sahte değerlerdir - locals()pratikte kullanmak daha mantıklı olabilir .

Bunu içine sabit kodlamanız gerektiğini unutmayın; o şekilde çalışmayacak pdb. İstediğin buysa, DoxaLogos'un cevabı muhtemelen aradığına daha çok benziyor.


3

Hızlı ve kolay yol:

from IPython.Debugger import Tracer
debug = Tracer()

O zaman sadece yaz

debug()

programınızda hata ayıklamaya başlamak istediğiniz yere.


1
ImportError: No module named 'IPython.Debugger'python 3.4 / IPython 3
ostrokach

2

Son birkaç gündür bunu birkaç kez google'da aradım, bu yüzden bir cevap ekledim ... bazen bir komut dosyasını normal şekilde çalıştırabilmek ipdb.set_trace()ve koda kesme noktaları koymak zorunda kalmadan yalnızca hatalarda ipython / ipdb'ye düşmek güzeldir

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

(ilk pip install ipythonve pip install ipdbtabii ki)


1
Teşekkür ederim! Biraz daha basit:ipython --pdb -- ./path/to/my/script --with-args here
alisianoi

0

Bu oldukça basit:

ipython some_script.py --pdb

İPython kurulumuna ihtiyaç duyar, genellikle bu çalışır: pip install ipython

İpython yerine ipython3 kullanıyorum, bu yüzden Python'un yeni bir sürümü olduğunu biliyorum.

Bunu hatırlamak kolaydır çünkü python yerine iPython kullanırsınız ve sonuna --pdb eklersiniz.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.