işlevi çalıştırırken python yorumlayıcısına bırakın


91

işleve sahip bir python modülüm var:

def do_stuff(param1 = 'a'):
    if type(param1) == int:
        # enter python interpreter here
        do_something()
    else:
        do_something_else()

Yorumun bulunduğu komut satırı yorumlayıcısına girmenin bir yolu var mı? böylece aşağıdakileri python'da çalıştırırsam:

>>> import my_module
>>> do_stuff(1)

Yorumun bulunduğu yerin kapsamı ve bağlamında bir sonraki istemimi alıyorum do_stuff()?


Yanıtlar:


61

Ekleniyor

import pdb; pdb.set_trace()

o noktada python hata ayıklayıcısına girecek

Buraya bakın: http://docs.python.org/library/pdb.html


pdbharika vanilya pitonu; harici bir paket getirmek için yeriniz varsa ipdb, harika - hata ayıklayıcı ile aynı işlevsellik, ancak ipython'un sözdizimi vurgulama, sekme tamamlama vb.
khstacking

Güncelleme - ipdbkullanımdan kaldırıldı, bugünlerde benzer özelliklere sahip olan pdbpp( pdb++) kullanıyorum ve import pdb; pdb.set_trace()
bunlarla

@hangtwenty: Neden ipdbkullanımdan kaldırıldı diyorsunuz ? Bununla ilgili herhangi bir haber bulamıyorum.
Nick Matteo

@Kundor huh, haklısın. Yazarların projeyi sürdürmeyi bırakmaya karar verdikleri ve bunun yerine kullanmak için başka bir projeye işaret ettikleri bir yeri okuduğumu açıkça hatırlıyorum. Belki bu bir süre oldu ve sonra yeniden dirildi? Yanlış olabilirim! Her iki durumda da, daha ipdbönce eğlendim , ama o pdbppzamandan beri de keyif aldım
driftcatcher

144

Standart bir etkileşimli bilgi istemi istiyorsanız (ön otomasyonda gösterildiği gibi hata ayıklayıcı yerine), bunu yapabilirsiniz:

import code
code.interact(local=locals())

Bakınız: kod modülü .

IPython yüklediyseniz ve bunun yerine bir IPython kabuğu istiyorsanız, bunu IPython> = 0.11 için yapabilirsiniz:

import IPython; IPython.embed()

veya eski sürümler için:

from IPython.Shell import IPShellEmbed
ipshell = IPShellEmbed()
ipshell(local_ns=locals())

27
IPython> = 0.11 için, IPython'da başka Shell modülü yok ... bu yüzden onun yerine "import IPython; IPython.embed ()" kullanarak başlayın.
evandrix

code.interact()PDB'ye girdikten sonra devam etmek mümkün mü c(ontinue)?
Nick T

4
code.interact()engelleyen bir çağrıdır. Programınız duracak ve bitmesini bekleyecektir. Etkileşimli tercümandan çıkarsanız, programınız hemen aşağıdaki ifadeyle devam etmelidir.
Matt Anderson

1
Etkileşimli bir bilgi istemi ile hata ayıklayıcı arasındaki fark nedir?
StockB

1
@StockB Bunu önemli kılan standart etkileşimli bilgi istemidir . Ayıklama aracıdır bir interaktif istemi, ancak aynı değil. help
PDB'de

30

Varsayılan bir Python yorumlayıcısı istiyorsanız, şunları yapabilirsiniz:

import code
code.interact(local=dict(globals(), **locals()))

Bu hem yerellere hem de küresellere erişime izin verecektir.

Bir IPython yorumlayıcısına bırakmak istiyorsanız, IPShellEmbedçözüm güncel değildir . Şu anda ne işe yarıyor:

from IPython import embed
embed()

8
teşekkürler, code.interact(local=dict(globals(), **locals()))çok daha iyi code.interact(local=locals())çünkü ikincisi paketleri yeniden içe aktarmanızı sağlıyor
s2t2

Python kodumu çağırmak için bir bash betiği kullandığım için bu cevap benim için daha iyi çalıştı. Kabul edilen cevabı kullanarak python kodumla etkileşim kuramadım. Teşekkürler!
jonathanking
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.