PDB kesme noktalarını Python koduna koymanın daha basit yolu?


105

Sadece bir kolaylık sorusu. Visual Studio ve XCode gibi IDE'lerde hata ayıklayıcılarla biraz şımarık oldum. import pdb; pdb.set_trace()Bir kesme noktası belirlemek için yazmak zorunda kalmayı biraz beceriksiz buluyorum (unutup bırakabileceğim için dosyanın tepesine pdb'yi içe aktarmayı tercih etmem).

Python kodunda bir IDE'de gördüğünüz kadar basit ve göze batmayan bir kesme noktası belirlemenin daha basit bir yolu var mı?


PyCharm'ı kullanın. Python IDE kullanarak çalıştırmak dışında bir kesme noktası satırı girmekten nasıl daha basit olabilir?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

python -m pdb <your_script>.py Ardından b <line_number>, kesme noktasını seçilen satır numarasına ayarlamak için kullanın (işlev parantezi yok). Hit csizin kesme devam etmek. bKomutu kullanarak tüm kesme noktalarınızı tek başına görebilirsiniz. Tip helpayıklama ederken diğer pdb komutları görmek üzere.
arcseldon

1
Python 3.7'den beri, artık yerleşik breakpoint()işlevi kullanabilirsiniz . python.org/dev/peps/pep-0553
Daniel

Yanıtlar:


117

Programınızı pdbkomut satırından çalıştırabilirsiniz.

python -m pdb your_script.py

1. satırda kırılacak, ardından breakkomutu kullanarak kodunuzda istediğiniz yere bir kesme noktası ekleyebileceksiniz , sözdizimi:

b (yeniden) [[dosyaadı:] lineno | işlev [, koşul]]

Size herhangi bir yere kesme noktası ekleme yeteneği verecek kadar esnektir.


24
Bu noktayı açıklığa kavuşturmak için, eğer pdb.set_trace()hata ayıklayıcıya girersem, lkomutu (list) kullanın ve 27. satırda bir kesme noktası ayarlamak istediğimi görün, sonra şunu girerim: b 27ve hata ayıklayıcı, 27. satırda bir kesme noktası ayarlar (buldum belgelerin anlaşılması biraz zor, bu yüzden bu açıklama noktasını eklemek istedim).
benjaminmgross

9
Ayrıca, bir nesneniz xvarsa ve yöntemi fçağrıldığında durmak istiyorsanız break x.f, ve sonra diyebilirsiniz c(ontinue). Bu, nesne erişilemez bir dosyada olsa veya dinamik olarak oluşturulmuş olsa bile, örneğin işaretlemeyi kaldırarak çalışır.
osa

2
Bir yığın izlemeden sonra hata ayıklarken, tam yolu bir modüle kopyalayabilir ve şu şekilde satır numarasını ekleyebilirsinizb /data/users/me/project/env/local/lib/python2.7/site-packages/django/core/urlresolvers.py:596
geçerli

58

Kullanabilirsiniz:

from pdb import set_trace as bp

code
code
bp()
code
code

neden gereksiz örtüşme olduğundan emin değilim, ama ;-). Bazı nedenlerden dolayı IDE / Editör'üm (vscode) bu AM kısraktı ve altını çizmeye devam ediyor. Yorumunu görmek bana gerçekten yardımcı oldu. İyi günler!
MrMesees

Çok teşekkür ederim!
demir atanlar

set_traceYalnızca bp () kullandığımda içe aktarmaya nasıl zorlayabilirim ?
alper

39

Vim'de bunun için ayarlanmış bir makro var (.vimrc dosyamda):

map <silent> <leader>b oimport pdb; pdb.set_trace()<esc>
map <silent> <leader>B Oimport pdb; pdb.set_trace()<esc>

bu yüzden sadece \ b'ye basabilirim (Ekleme Modunda değilken) ve mevcut satırdan sonra bir kesme noktası ekler veya \ B (büyük harfle dikkat edin) ve mevcut satırın önüne bir tane koyar.

bu iyi çalışıyor gibi görünüyor. Diğer 'basit' programcı editörlerinin çoğu (emacs, sublimetext, vb.) Bunu yapmak için benzer kolay yollara sahip olmalıdır.

Düzenleme: Aslında var:

au FileType python map <silent> <leader>b oimport pdb; pdb.set_trace()<esc>
au FileType python map <silent> <leader>B Oimport pdb; pdb.set_trace()<esc>

bu sadece python kaynak dosyaları için açar. Javascript veya kullandığınız diğer diller için benzer satırları çok kolay bir şekilde ekleyebilirsiniz.

2019 Güncellemesi (Python 3.7+)

Python 3.7+ artık vim'de öncekinin breakpoint()yerini alabilecek yerleşik bir yapıya sahip import pdb; pdb.set_trace(). Hala aynı şekilde çalışıyor.


2
Eğer varsa güzel bir çözüm ve katma satırı çok doğru girinti olacak set autoindentsenin içinde .vimrc dosyası.
Jealie

Evet, çoğu dağıtımın neden set autoindentstandart olarak (ve bir sürü başka seçenekle) gönderilmediğini anlayamıyorum . Yeni bir sistemle yaptığım ilk şeylerden biri daha iyi bir vimrc çekmek ...
Daniel

1
Sadece register adlı bir vim kullanın! 'D' ara belleğine almak istediğiniz satırı ( d ebug'da olduğu gibi ) tuşuna basarak kaydedin "dyyve ihtiyacınız olduğunda sadece yapın "dpveya "dP. Vim kayıtlarını öğrenin ! Çok faydalıdırlar ve her zaman desteklenirler!
polvoazul

nasıl eklenir: bundan sonra w?
ji-ruh

Adlandırılan yazmaç konseptini biraz daha ileri götürerek bir makro kaydedebilir, gerekli işlemleri yapabilir ve ardından makroyu durdurabilirsiniz. Ardından makro içeriğini vimrc dosyanıza yapıştırın. Örneğin, makroyu ile başlatın qd, sonra "dpyapıştırın. Son olarak, talimatlarınızı her zaman vim yüklemesinde doldurulan bir kayda atayın. Örnek: let @d = 'oimport pdb; pdb.set_trace()k0:w' Şimdi, @dsatırı bir dosyaya yapıştırmak istediğinizde kullanın. Yukarıdakiler de dosyayı kaydeder. Ancak, özel karakterler (kaçış vb. İçin) dahil edildiğinden, kendi karakterinizi (yukarıya kopyala / yapıştırmak yerine) kaydetmeniz gerekecektir.
arcseldon

27

Programı her çalıştırdığınızda (Python 3.2+) manuel olarak kesme noktaları ayarlamak istemiyorsanız, örneğin 3. satırda doğrudan bir kesme noktası oluşturmak ve orada yürütmeyi durdurmak istediğinizi söyleyin:

python -m pdb -c "b 3" -c c your_script.py

Aşağıdaki bilgiler yardımcı olabilir:

Kullanıcının ana dizininde veya geçerli dizinde .pdbrc dosyası varsa, hata ayıklayıcı komut isteminde yazılmış gibi okunur ve yürütülür. Bu özellikle takma adlar için kullanışlıdır. Her iki dosya da mevcutsa, ana dizindeki ilk önce okunur ve orada tanımlanan takma adlar yerel dosya tarafından geçersiz kılınabilir.

Sürüm 3.2'de değiştirildi: .pdbrc artık devam veya sonraki gibi hata ayıklamaya devam eden komutlar içerebilir. Önceden, bu komutların hiçbir etkisi yoktu.

Sürüm 3.2'deki yenilikler: pdb.py artık komutları bir .pdbrc dosyasında verilmiş gibi yürüten bir -c seçeneğini kabul ediyor, bkz. Hata Ayıklayıcı Komutları.



10

Kaynak kodunuzda herhangi bir şey uygulamadan pdb'yi komut satırında şu şekilde kullanırsınız (belgeler ve diğer çevrimiçi kaynaklar bunu geçmişte yalnızca görsel hata ayıklayıcıları kullanan bir programcıya açıklamak için iyi bir iş çıkarmaz):

Aşağıdakileri bir kabuk istemine yazarak pdb'yi başlatın:

python -m pdb 'python_script'

Bu komut pdb'yi başlatır ve pdb hata ayıklayıcı python_script'inizin ilk satırında kırılır ve sizden bir girdi bekler:

(Pdb)

Bu, hata ayıklayıcı ile iletişim kurmak için kullanılan arayüzdür. Şimdi komutlarınızı burada belirtebilirsiniz. Görsel hata ayıklayıcılarda düğmeleri veya klavye kısayollarını kullanmanın aksine, burada aynı sonuçları elde etmek için komutları kullanacaksınız.

Kodunuzun sonraki satırına "n" komutuyla (sonraki) gidebilirsiniz:

(Pdb) n

Bir sonraki işlem, satır numarasını ve kaynaktaki belirli kodu görüntüler:

> python_script(line number)method name
-> current line in the source code

Kaynak kodunuzda bir satır numarası belirterek bir kesme noktası ayarlayabilirsiniz.

(Pdb) b 50

Burada, hata ayıklayıcı satır 50'de kırılacak şekilde ayarlanır. Başka herhangi bir kesme noktası yoksa, satır 50'deki kesme noktası ilk olacaktır ve bu durumda 1 olan kesme noktası kimliği tarafından referans alınabilir. Daha fazla kırılma noktası eklerseniz, sırayla tanımlayıcıları alırlar (yani 2, 3 vb.)

Bir kesme noktası ayarlandıktan sonra, pdb aşağıdaki gibi kesme noktasına gelene kadar programınızı çalıştırmaya devam edersiniz:

(Pdb) c

Bir kesme noktasına ulaştığınızda, daha önce açıklandığı gibi n komutuyla sonraki satıra gidebilirsiniz. Değişkenlerin değerlerini incelemek istiyorsanız, parametre komutunu aşağıdaki gibi çalıştırmalısınız:

(Pdb) p variable_name

Artık bir kesme noktasına ihtiyacınız yoksa, temizleme komutuyla kesme noktasının kimliğini girerek onu temizleyebilirsiniz:

(Pdb) clear 1

Son olarak, hata ayıklayıcıyla işiniz bittiğinde, python komut satırı yorumlayıcısından çıktığınız gibi yürütmeden çıkabilirsiniz.

(Pdb) exit()

Umarım bu, herkesin pdb ile başlamasına yardımcı olur. Hata ayıklayıcı ile kullanabileceğiniz komutların bir listesi: pdb yani soru ve cevaplar



4

Python hata ayıklamasını destekleyen bir IDE kullanabilir veya mükemmel Winpdb aracına bakabilirsiniz. Herhangi bir platformda çalışır ve python betiğiniz için grafiksel hata ayıklama olanakları sağlar.

http://winpdb.org/


2

Kullanabilirsiniz:

  • kanat fikri
  • pydev eklentisi ile tutulma
  • Pycharms

Yukarıdakilerin tümü bir IDE'nin içinden python hata ayıklamasını destekler.


0

Atom'da Python eklentileri yüklüyse, sadece ' pdb' yazıp enter tuşuna basmanız yeterlidir; snippet, sizin için içe aktar yazacak ve geriye doğru izleyecektir.

Şimdi buna alıştım, bazen onu vim'de düzenlesem ve açılır listenin görünmesini bekliyorsam bile yazıyorum.


0

Düşük bir yöntem, kesme noktasını doğrudan pdb'de ayarlamaktır:

pdb> b torch/__init__:10

üzerinde bir kesme noktası belirleyecek site-packages\torch\__init__.py:10

Sonra pdb> cbu kesme noktasında duracak.

Aşağıdakiler de geçerlidir:

pdb> b d:\anaconda\lib\site-packages\torch\__init__.py:10
pdb> b torch\__init__.py:10
pdb> b d:\\anaconda\\lib\\site-packages\\torch\\__init__.py:10
pdb> b d:/anaconda/lib/site-packages/torch/__init__.py:10

Ayrıntılar için belgeye bakın .


0

Sen ile Vim kullanabilirsiniz Python Modu ile eklenti veya Emacs Elpy eklentisi.

Bu eklentiler size kolay tuş vuruşları ile kesme noktaları ( \ bVim ve C-c C-u bEmacs'de) ve ayrıca ağır IDE'lerden (kod katlama, yeniden düzenleme, linting, vb.) Birçok başka özellik sunar - hepsi hafif terminal tabanlı bir metin düzenleyicide.


-1

Hata ayıklayıcıyı komut dosyanızda çalıştırmanın en basit yolu,

pdb your_script.py

Linux komut satırında pdb çalıştırmak,

usage: pdb.py scriptfile [arg] ...

Nasıl kurulur pdb? Veya nereden?
kenorb
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.