Hata ayıklama sorunlarına yardımcı olmak için Python kodunda nasıl ilerlenir?


187

Java / C # 'da neyin yanlış gittiğini takip etmek için kod içinde kolayca adım atabilirsiniz ve IDE'ler bu işlemi çok kullanıcı dostu hale getirir.

Python kodunu benzer bir şekilde izleyebilir misiniz?

Yanıtlar:


264

Evet! Adında bir Python hata ayıklayıcısı varpdbSadece bunu yapmak için var!

Sen aracılığıyla bir Python programı başlatabilirsiniz pdbkullanarak pdb myscript.pyveyapython -m pdb myscript.py .

Daha sonra düzenleyebileceğiniz birkaç komut vardır. pdb sayfada .

Hatırlanması gereken bazı yararlı noktalar:

  • b: kesme noktası ayarla
  • c: bir kesme noktasına ulaşana kadar hata ayıklamaya devam et
  • s: kodda ilerleyin
  • n: sonraki kod satırına gitmek için
  • l: geçerli dosya için kaynak kodunu listeler (varsayılan: yürütülmekte olan satırı içeren 11 satır)
  • u: yığın karesinde yukarı git
  • d: yığın karesinde aşağı gitme
  • p: geçerli bağlamda bir ifadenin değerini yazdırmak için

Komut satırı hata ayıklayıcısı kullanmak istemiyorsanız, Pydev , Wing IDE veya PyCharm gibi bazı IDE'lerin GUI hata ayıklayıcısı vardır. Wing ve PyCharm ticari ürünlerdir, ancak Wing'in ücretsiz bir "Kişisel" sürümü vardır ve PyCharm'ın ücretsiz bir topluluk sürümü vardır.


10
Vay canına, linux / ubuntu için grafiksel bir pdb bulmakta zorlandığımı düşünemiyorum. Bir şey mi kaçırıyorum? Bunun için bir SublimeText Eklentisi yapmak içine bakmak gerekebilir.
ThorSummoner

4
PyCharm grafik hata ayıklayıcı olarak oldukça iyidir ve Topluluk Sürümü ücretsizdir!
Pieter

@ThorSummoner, pudbbunun için harika. Ayrıcapydev
alpha_989

pdbbir komut satırı aracı değildir. Kullanmak için kullanın python -m pdb your_script.py.
jdhao

@jdhao Sanırım standart değil, ama Ubuntu'da pdbkomut pythonpaketin bir parçası . Her durumda, python -m <module>gibi diğer şeyler için standart haline geliyor pip, bu yüzden bunu varsayılan olarak kullanmak muhtemelen en iyisidir.
wjandrea

55

Python Interactive Debugger 'pdb' kullanarak

İlk adım, Python yorumlayıcısının hata ayıklama moduna girmesini sağlamaktır.

A. Komut Satırından

Python yorumlayıcısının komut satırından en düz yol

$ python -m pdb scriptName.py
> .../pdb_script.py(7)<module>()
-> """
(Pdb)

B. Tercüman İçinde

Modüllerin erken sürümlerini geliştirirken ve daha tekrarlı olarak denemek için.

$ python
Python 2.7 (r27:82508, Jul  3 2010, 21:12:11)
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pdb_script
>>> import pdb
>>> pdb.run('pdb_script.MyObj(5).go()')
> <string>(1)<module>()
(Pdb)

C. Programınızın İçinden

Büyük bir proje ve uzun süren bir modül için, alma pdb ve set_trace () kullanarak programın içinden hata ayıklamayı başlatabilir :

#!/usr/bin/env python
# encoding: utf-8
#

import pdb

class MyObj(object):
    count = 5
    def __init__(self):
        self.count= 9

    def go(self):
        for i in range(self.count):
            pdb.set_trace()
            print i
        return

if __name__ == '__main__':
    MyObj(5).go()

Daha dahili hale gelmek için adım adım hata ayıklama

  1. Bir sonraki ifadeyi yürütün… “n” ile (sonraki)

  2. Son hata ayıklama komutunu tekrarlama… ENTER ile

  3. Hepsini bırak … “q” ile (çık)

  4. Değişkenlerin değerinin yazdırılması… “p” ile (yazdır)

    a) pa

  5. (Pdb) istemini kapatma… “c” ile (devam)

  6. Nerede olduğunuzu görmek… “l” ile (liste)

  7. Altyordamlara adım atmak… “s” ile (adım adım)

  8. Devam ediyor… ama sadece mevcut altyordamın sonuna… “r” ile (dönüş)

  9. Yeni bir değer atayın

    a) ! b = "B"

  10. Bir kesme noktası ayarlayın

    a) çamaşır numarasının kesilmesi

    b) işlev ismini kır

    c) dosya ismini kır: linenumber

  11. Geçici kesme noktası

    a) lastik numarası

  12. Koşullu kesme noktası

    a) koparmak linenumber, koşul

Not: ** Tüm bu komutlar ** pdb'den yürütülmelidir

Ayrıntılı bilgi için bakınız: -

https://pymotw.com/2/pdb/

https://pythonconquerstheuniverse.wordpress.com/2009/09/10/debugging-in-python/


41

Python'da 'pdb' adlı bir modül var. Python betiğinizin üstünde

import pdb
pdb.set_trace()

ve hata ayıklama moduna gireceksiniz. 'S' ile adım atabilir, 'n' ile 'gdb' hata ayıklayıcısında yapacağınız gibi bir sonraki satırı takip edebilirsiniz.


21

Python 3.7'den başlayarak breakpoint(), hata ayıklayıcıyı girmek için yerleşik işlevi kullanabilirsiniz:

foo()
breakpoint()  # drop into the debugger at this point
bar()

Varsayılan olarak, breakpoint()içe aktarır pdbve arar pdb.set_trace(). Ancak, hata ayıklama davranışını sys.breakpointhook()ortam değişkeni üzerinden ve kullanımını denetleyebilirsiniz PYTHONBREAKPOINT.

Daha fazla bilgi için PEP 553'e bakınız .


2
Gördüğümde breakpointheyecanlandım. Ama sonra bunun sadece bir kısayol olduğunu öğrendim import pdb; pdb.set_trace()ve bu beni üzdü. Python devs: Lütfen bağlam satırları, kalıcı komut geçmişi ve sekme otomatik tamamlama gibi temel GDB özellikleri ile PDB geliştirmeye odaklanın :-)
Ciro Santilli :0 冠状 病 六四 事件 法轮功

11

ipdb (IPython hata ayıklayıcısı)

ipdb, pdb'ye IPython işlevselliği ekleyerek aşağıdaki BÜYÜK geliştirmeleri sunar:

  • sekme tamamlama
  • daha fazla bağlam satırı göster
  • sözdizimi vurgulama

Pdg'ye benzer şekilde, ipdb GDB'ye kıyasla hala mükemmel ve tamamen temelden uzaktır, ancak zaten pdb'ye göre büyük bir gelişme.

Kullanımı ile benzer pdb, sadece ile yükleyin:

python3 -m pip install --user ipdb

ve ardından hata ayıklamak istediğiniz satıra ekleyin:

__import__('ipdb').set_trace(context=21)

Muhtemelen editörünüzden bunun için bir kısayol eklemek istiyorsunuz, örneğin Vim snipmate için:

snippet ipd
    __import__('ipdb').set_trace(context=21)

sadece yazabilirim ipd<tab>ve kesme noktasına kadar genişler. Daha sonra ddher şey tek bir satırda bulunduğundan kaldırmak kolaydır .

context=21bağlam satırlarının sayısını şöyle açıklar: Hata ayıklama sırasında ipdb'nin daha fazla bağlam satırı göstermesini nasıl sağlayabilirim?

Alternatif olarak, başlangıçtan itibaren programlarda hata ayıklayabilirsiniz:

ipdb3 main.py

ancak genellikle bunu yapmak istemezsiniz çünkü:

  • Python bu satırları okurken tüm işlev ve sınıf tanımlarını gözden geçirmeniz gerekir.
  • Ben ipdb kesmek olmadan orada bağlam boyutunu ayarlamak için nasıl bilmiyorum. İzin vermek için yama: https://github.com/gotcha/ipdb/pull/155

Alternatif olarak, ham pdb 3.2 ve üstü sürümlerde olduğu gibi, komut satırından bazı kesme noktaları ayarlayabilirsiniz:

ipdb3 -c 'b 12' -c 'b myfunc' ~/test/a.py

bir -c csebepten dolayı kırık olsa da: https://github.com/gotcha/ipdb/issues/156

python -m modulehata ayıklama şu şekilde sorulmuştur: Python -m ile çalışan bir Python modülünde komut satırından nasıl hata ayıklanır? ve Python 3.7 aşağıdakilerle yapılabileceğinden:

python -m pdb -m my_module

GDB'ye kıyasla hem pdb hem de ipdb'nin ciddi eksik özellikleri:

ipdb özel sıkıntılar:

Ubuntu 16.04'te test edildi, ipdb == 0.11, Python 3.5.2.



3

Java / C # arka plandan geliyorsa ben en iyi bahis kullanmak olacaktır sanırım Eclipse ile Pydev . Bu yerleşik hata ayıklayıcı ile tamamen işlevsel bir IDE verir. Ben de django ile kullanın.




2

Python Tutor acemiler için tasarlanmış çevrimiçi tek adımlı bir hata ayıklayıcıdır. Düzenleme sayfasına kod ekleyebilir ve ardından çalışmaya başlamak için "Yürütmeyi Görselleştir" i tıklayabilirsiniz.

Diğer şeylerin yanı sıra şunları destekler:

Bununla birlikte , pek çok şeyi de desteklemez , örneğin:

  • Dosyaları okuma / yazma - kullanın io.StringIOve io.BytesIObunun yerine: demo
  • Çok büyük, çok uzun çalışan veya çok fazla değişken veya nesne tanımlayan kod
  • Komut satırı bağımsız değişkenleri
  • Argparse, csv, enum, html, os, struct, poorref gibi birçok standart kütüphane modülü ...

1

Programlı olarak python kodu ile adımlama ve izleme de mümkündür (ve kolay!). Bak sys.settrace () Ayrıntılar için belgelere. Ayrıca burada başlamanıza yardımcı olacak bir eğitim.



1

PyCharm, bir hata ayıklayıcı içeren Python için bir IDE'dir. Kodda gezinmek için PyCharm'ın hata ayıklayıcısını kullanma hakkında bir tanıtım için bu YouTube videosunu izleyin.

PyCharm Tutorial - PyCharm'ı kullanarak python kodunda hata ayıklama

Not: Bu bir onaylama veya inceleme amaçlı değildir. PyCharm, ödemesi gereken ticari bir üründür, ancak şirket, öğrencilere ve öğretmenlere ücretsiz bir lisansın yanı sıra ücretsiz ve açık kaynaklı bir "hafif" Topluluk sürümü sağlar.

Ekran görüntüsü

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.