Python'un kendi hata ayıklayıcısında (PDB) çok satırlı deyimler nasıl çalıştırılır


157

Bu yüzden içinde yazarak Python hata ayıklayıcı, PDB çağırıyorum bir Python komut dosyası çalıştırıyorum:

import ipdb; ipdb.set_trace()

(iPython'un PDB sürümü, buna rağmen fark yarattığını düşünmüyorum; sadece renkli çıktı için kullanıyorum).

Şimdi, hata ayıklayıcısına geldiğimde, if cümlesi veya bir for döngüsü gibi çok satırlı bir deyimi yürütmek istiyorum, ancak yazdığım anda

if condition:

ve dönüş tuşuna basın, hata mesajını alıyorum *** SyntaxError: invalid syntax (<stdin>, line 1)

PDB içinde çok satırlı ifadeler nasıl çalıştırılabilir? Mümkünse, hala bir if yan tümcesi veya bir for döngüsü yürütmenin bir yolu var mı?

Yanıtlar:


265

Bunu pdb'deyken mevcut tüm yerel değişkenlerle geçici bir etkileşimli Python oturumu başlatmak için yapabilirsiniz:

(pdb) !import code; code.interact(local=vars())
Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41) 
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> 

İşiniz bittiğinde, normal pdb istemine geri dönmek için Ctrl-D tuşlarını kullanın.

Tüm pdb oturumunu sonlandıracak olan Ctrl-C'ye basmayın.


46
Aynı şey interact( bu hata izleyici mesajından öğrendiğim gibi) pdb komutunu kullanarak elde edilebilir gibi görünüyor .
gerrit

3
İfadede neden !gerekli import?
Indradhanush Gupta

19
Muhtemelen gerekli değildir, ancak !kazaları önlemek için tüm Python ifadelerini pdb ile önek olarak alıştırma alışkanlığım var . Örneğin c = 42pdb'de değişkene atamak yerine yürütmeye devam ederc .
Marius Gedminas

8
@MariusGedminas PDB ile en sinir bozucu şey! Güzel olurdu onların komutları ... öneki gerekiyordu
Ian Clark

Not: Ctrl-D de çıkmak için doğru yol gibi görünüyor interact, ancak Spyder ile benim için iyi oynamıyor.
Josiah Yoder

69

Python3 ipdb(ve pdb) 'de etkileşim adında bir komut var . Aşağıdakiler için kullanılabilir:

Genel ad alanı geçerli kapsamda bulunan tüm (genel ve yerel) adları içeren etkileşimli bir yorumlayıcı ( kod modülünü kullanarak ) başlatın.

Kullanmak interactiçin pdb komut istemine girmeniz yeterlidir . Diğer şeylerin yanı sıra, birden çok satıra yayılan kod uygulamak ve diğer pdb komutlarının yanlışlıkla tetiklenmesini önlemek için de yararlıdır.


2
Bunu yaparken bana "NameError: 'etkileşim' adı tanımlanmadı" veriyor.
Jason

1
@jason sürüm 3.2 veya üzeri
vaer-k

2
Bu açıklar. Python 2.7'deydim.
Jason

Dikkat bu aslında etkileşim olabilir tanımlanamadı ve işlemden çıkmış bir hata attı
Camron_Godbout

1
Kaçının interactönermenin çok güçlü bir öneri olduğunu düşünüyorum . % 90 tüm ihtiyacım olan bu ve yazmak çok daha kolayfrom IPython import embed; embed()
vaer-k

43

Benim tavsiyem IPython katıştırmayı kullanmak.

ipdb> from IPython import embed; embed()

2
Liste anlamada değer tanımlı değil hatası alıyorsanız, IPython'dan kullanmayı deneyin import embed; embed(user_ns=locals()).
fx-kirin

1
bu benim için kabul edilen cevaptan çok daha iyi çalışıyor. Örneğin - çok satırlı düzgün bir şekilde düzenlemeye izin verir - birkaç satır geriye gitmek ve bir şeyi düzeltmek gibi, böylece tüm çok satırlı ifadenizi tekrar yazmak zorunda kalmazsınız ... Yerelleri @ fx-kirin olarak geçiriyorum önerildi.
ZeDuS

33

Python (2.7.1) yorumlayıcısının veya hata ayıklayıcısının (import pdb) içinde, aşağıdaki sözdizimiyle çok satırlı bir deyim yürütebilirsiniz.

for i in range(5): print("Hello"); print("World"); print(i)

Not: Tercümanın içindeyken, kod yürütülmeden önce iki kez geri dönmem gerekir. Ancak hata ayıklayıcının içinde, yalnızca bir kez geri dönmek zorundayım.


5
Bir seviyeden daha derin bir şey çalıştırmaya izin vermez.
Antony Hatchkins

7

Bir kırılma noktasına çarparken birkaç komutun yürütülmesini istiyorsanız özel durum söz konusudur. Sonra hata ayıklayıcı komutu var commands. Birden fazla komut satırı girmenizi ve ardından tüm diziyi endanahtar sözcükle sonlandırmanızı sağlar . İle daha fazlası (pdb) help commands.


2

Bunu yapabilir, bilmiyorum ama bu ipdb için harika bir özellik olurdu. Tabii ki liste kavrayışlarını kullanabilir ve aşağıdakiler gibi basit çok satırlı ifadeleri yürütebilirsiniz:

if y == 3: print y; print y; print y;

Ayrıca, normalde birden fazla satır alacak olan, ihtiyacınız olan her şeyi yapmak için önceden bazı işlevler yazabilirsiniz.

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.