


Ringkasan penggunaan alat penyahpepijat python pdb (Python Debugger)
Artikel ini membawakan anda pengetahuan yang berkaitan tentang Python Ia terutamanya memperkenalkan kandungan yang berkaitan tentang alat penyahpepijatan pdb, termasuk perintah pdb asas, menetapkan titik putus dengan rehat, dll. Mari kita lihat bersama-sama, saya harap. ia akan membantu semua orang.
[Cadangan berkaitan: Tutorial video Python3 ]
1. Terdapat 2 cara untuk menggunakan pdb
pdb: python debugger
1. Kaedah tidak mengganggu (Tidak perlu mengubah suai kod sumber, anda boleh nyahpepijat dengan menjalankannya terus dari baris arahan)
python3 -m pdb filename.py
2 Kaedah mengganggu (Anda perlu menambah kod berikut pada kod yang sedang dinyahpepijat dan kemudian jalankan kod seperti biasa) <.>
import pdb pdb.set_trace()Apabila anda melihat gesaan berikut pada baris arahan, ini bermakna pdb
(Pdb)2. perintah asas pdb
Dalam penggunaan sebenar, kami mendapati bahawa apabila menjalankan fail python dengan skrip shell, ia mungkin tidak boleh dinyahpepijat menggunakan pdb dan ia akan keluar. Pada masa ini, anda hanya boleh menjalankan fail py secara langsung untuk penyahpepijatan.
3. Gunakan perintah putus untuk menetapkan titik putus pada lokasi yang ditentukan dalam fail yang ditentukan
3.1 Tetapkan titik putus pada lokasi yang dinyatakan dalam fail ini
Sebagai contoh, dalam contoh berikut, jika anda ingin memasukkan kaedah ke hadapan() model untuk melihat proses pemprosesan data semasa perambatan ke hadapan, anda hanya boleh menetapkan rehat dalam baris pertama of forward() (line 26 Point, pdb.set_trace()
Tetapi kadangkala model ini sangat kompleks, dan menggunakan kaedah ini akan menyebabkan program melaporkan ralat dan keluar terus (saya tidak tahu sebabnya), maka kita boleh mempertimbangkan untuk menggunakan perintah break di sini Masukkan titik putus dalam satu baris supaya program akan berhenti apabila ia mencapai ke hadapan ().
import torchimport torch.nn as nnimport pdbclass EncoderLayer(nn.Module): def __init__(self): super().__init__() self.conv1 = nn.Conv2d(4, 10, (3, 3)) self.conv2 = nn.Conv2d(10, 4, (3, 3)) self.relu = nn.ReLU() def forward(self, x): x=self.relu(self.conv1(x)) return self.relu(self.conv2(x))class Encoder(nn.Module): def __init__(self,num_layers): super().__init__() # encoders 由 num_layers个 EncoderLayer子层组成,每个子层结构相同,但参数不一定相同。 self.ModelList = nn.ModuleList([EncoderLayer() for _ in range(num_layers)]) def forward(self, x): # ModuleList是一个list,只能通过list的操作方式(如用for循环、下标索引等)进行forward计算。 for layer in self.ModelList: x = layer(x) return xif __name__=="__main__": pdb.set_trace() input = torch.rand(5, 4, 30, 30) model = Encoder(num_layers=4) output = model(input)
Kaedah khusus: (1) Pertama set pdb.set_trace() pada mana-mana baris sebelumnya untuk menghentikan program. (2) Hanya masukkan rehat 26. Seperti yang ditunjukkan dalam gambar:
Dengan cara ini, titik putus berjaya ditetapkan dan program akan berhenti apabila ia mencapai ke hadapan().
Angka 26 di sini ialah nombor baris Perlu diingat bahawa kedudukan titik putus tidak boleh menjadi ulasan Sebagai contoh, jika kita menetapkan titik putus pada baris 25 (baris ulasan), ia akan gagal:
Untuk meringkaskan, arahan untuk menetapkan titik putus dalam fail yang sama ialah:
garis putus
3.2 Dalam lain-lain Tetapkan titik putus pada lokasi yang ditentukan dalam fail
Jika titik putus yang anda ingin tetapkan tiada dalam fail larian awal, bagaimana anda boleh menggunakan arahan putus untuk menetapkan titik putus dalam fail lain? Mari lihat contoh ini:
Bahagikan kod 3.1 kepada tiga fail py dan letakkannya dalam laluan yang sama:

Lihat kandungan setiap fail:
run.py:
Tetapan pdb.set_trace() awal berada dalam run.py.
import torchfrom encoder import Encoderimport pdbif __name__=="__main__": pdb.set_trace() input = torch.rand(5, 4, 30, 30) model = Encoder(num_layers=4) output = model(input)
enkoder.py:
from encoder_layer import EncoderLayerimport torch.nn as nnclass Encoder(nn.Module): def __init__(self,num_layers): super().__init__() # encoders 由 num_layers个 EncoderLayer子层组成,每个子层结构相同,但参数不一定相同。 self.ModelList = nn.ModuleList([EncoderLayer() for _ in range(num_layers)]) def forward(self, x): # ModuleList是一个list,只能通过list的操作方式(如用for循环、下标索引等)进行forward计算。 for layer in self.ModelList: x = layer(x) return x
encoder_layer.py:
import torch.nn as nnclass EncoderLayer(nn.Module): def __init__(self): super().__init__() self.conv1 = nn.Conv2d(4, 10, (3, 3)) self.conv2 = nn.Conv2d(10, 4, (3, 3)) self.relu = nn.ReLU() def forward(self, x): x=self.relu(self.conv1(x)) return self.relu(self.conv2(x))
Sekarang kita jalankan run.py, dan kemudian tetapkan titik putus pada baris 12 encoder.py, iaitu
untuk lapisan dalam diri.ModelList:
Arahannya ialah:
break encoder.py:12
Iaitu, break nama fail: lineKita dapat melihat bahawa atur cara boleh masuk ke hadapan() daripada output = model(input ):
Ini menjadikan penyahpepijatan sangat mudah.
Jika titik putus awal dan titik putus sasaran tidak berada dalam direktori yang sama, anda juga boleh menetapkan titik putus melalui nama fail di bawah laluan relatif, seperti:
(Pdb) break ../transformer/asr_model.py:91Breakpoint 1 at /local/wenet/examples/aishell/s0/wenet/transformer/asr_model.py:91(Pdb)
4. Gunakan Masalah yang ditemui semasa menggunakan pdb
4.1 Apabila menggunakan pautan lembut, laluan fail yang dipaparkan oleh pdb tidak konsisten dengan laluan sebenar
Seperti yang boleh didapati dalam rajah , pdb terdiri daripada tiga baris Baris pertama ialah laluan fail, baris kedua ialah baris kod yang sedang dilaksanakan, dan baris ketiga ialah baris arahan input.
Apabila terdapat pautan lembut, laluan yang dipaparkan oleh pdb ialah laluan yang ditunjukkan oleh pautan lembut, tetapi laluan kod sebenar ialah laluan yang menyalin kandungan pautan lembut ini adalah berbeza, jadi anda mesti memberi perhatian.
4.2 pdb kadangkala tidak boleh menambah titik putus dalam kaedah forward() model
pdb kadangkala tidak boleh menggunakan pdb set_trace(. ) menambah titik putus pada kaedah ke hadapan() model Mesej ralat ialah:
Fungsi terkumpul tidak boleh mengambil nombor pembolehubah argumen atau menggunakan argumen kata kunci sahaja dengan lalai
mungkin bermaksud "fungsi yang disusun tidak dapat menerima bilangan parameter yang berubah-ubah, dan tidak boleh menggunakan parameter kata kunci sahaja secara lalai." tidak diselesaikan.
5. Pasca nyahpepijat selepas program ranap: pdb.pm()
Seperti yang dinyatakan di atas, titik putus dimasukkan apabila program mula berjalan dan pdb digunakan untuk penyahpepijatan, iaitu,
Nyahpepijat terlebih dahulu. Malah, pdb juga boleh digunakan untuk penyahpepijatan bedah siasat, iaitu selepas program mengalami pepijat dan ranap, gunakan penyahpepijat python untuk melihatnya. Sebagai contoh, test.py jelas bermasalah:
Jalankan terus:# test.pydef add(n): return n+1add("hello")python test.py
Ranap program:Dengan cara ini kami tidak boleh menggunakan pdb untuk nyahpepijat. Jadi apabila program ranap, bagaimana kita harus nyahpepijatnya?
F:\PycharmProjects\pytorch_practice>python test.py Traceback (most recent call last): File "test.py", line 4, in <module> add("hello") File "test.py", line 2, in add return n+1 TypeError: can only concatenate str (not "int") to str</module>
Kami boleh menggunakan arahan berikut untuk penyahpepijatan mudah:
python -i test.pyPilihan -i membolehkan anda membuka Interaktif cangkerang, seperti berikut:
F:\PycharmProjects\pytorch_practice>python -i test.py Traceback (most recent call last): File "test.py", line 4, in <module> add("hello") File "test.py", line 2, in add return n+1 TypeError: can only concatenate str (not "int") to str >>></module>
现在我们发现程序结束后出现了 >>> 符号,这就是python调试器。
输入命令:
import pdb pdb.pm()
其中 pdb.pm() 用于程序发生异常导致奔溃后的事后调试,可以跟踪异常程序最后的堆在信息。
执行命令后得到:
TypeError: can only concatenate str (not "int") to str >>> import pdb >>> pdb.pm() > f:\pycharmprojects\pytorch_practice\test.py(2)add() -> return n+1 (Pdb)
可以发现,pdb.pm() 已经追踪到了导致程序奔溃的语句:return n+1
此时可以打印 n 的值进行检查:
(Pdb) p n'hello'(Pdb) q>>> quit() F:\PycharmProjects\pytorch_practice>
q 表示退出pdb调试,quit() 表示退出 python 调试器。
【相关推荐:Python3视频教程 】
Atas ialah kandungan terperinci Ringkasan penggunaan alat penyahpepijat python pdb (Python Debugger). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Pastikan Python dipasang dan ditambah ke laluan sistem, jalankan Python-versi atau Python3-pengesahan versi melalui terminal; 2. Simpan fail python sebagai lanjutan .py, seperti hello.py; 3. Buat sistem binaan tersuai dalam sublimetext, pengguna Windows menggunakan {"cmd": ["python", "-u", "$ file"]}, pengguna macOS/linux menggunakan {"cmd": ["python3

Untuk menyahpepijat skrip python, anda perlu terlebih dahulu memasang lanjutan python dan mengkonfigurasi penterjemah, kemudian buat fail launch.json untuk menetapkan konfigurasi debugging, kemudian tetapkan titik putus dalam kod dan tekan F5 untuk memulakan debugging. Skrip akan dijeda pada titik putus, membolehkan pembolehubah pemeriksaan dan pelaksanaan langkah demi langkah. Akhirnya, dengan memeriksa masalah dengan melihat output konsol, menambah log atau menyesuaikan parameter, dan lain -lain, untuk memastikan bahawa proses debugging adalah mudah dan cekap selepas persekitaran adalah betul.

Classmethodsinpythonareboundtotheclassandnottoinstances, membolehkanThemTobeCalledWithoutCreatingAnobject.1.theyaredefinedusingthe@Classmethoddecoratorandtakeclsasthefirstparameter, referringtotheclassitervarfe.2.TheycanCasteScess,

InstallSublimeTextandPython,thenconfigureabuildsystembycreatingaPython3.sublime-buildfilewiththeappropriatecmdandselectorsettingstoenablerunningPythonscriptsviaCtrl B.2.OrganizeyourprojectbycreatingadedicatedfolderwithPythonfilesandsupportingdocument

Asyncio.queue adalah alat giliran untuk komunikasi yang selamat antara tugas -tugas asynchronous. 1. Pengeluar menambah data melalui Awaitqueue.put (item), dan pengguna menggunakan Awaitqueue.get () untuk mendapatkan data; 2. Untuk setiap item yang anda proses, anda perlu memanggil giliran.task_done () untuk menunggu giliran.join () untuk menyelesaikan semua tugas; 3. Gunakan tiada sebagai isyarat akhir untuk memberitahu pengguna untuk berhenti; 4 Apabila pengguna berganda, isyarat akhir perlu dihantar atau semua tugas telah diproses sebelum membatalkan tugas; 5. Giliran menyokong menetapkan kapasiti had maksimum, meletakkan dan mendapatkan operasi secara automatik menggantung dan tidak menyekat gelung acara, dan program akhirnya melewati Canc

Kata kunci hasil digunakan untuk menentukan fungsi penjana, supaya ia dapat menjeda pelaksanaan dan mengembalikan nilai satu demi satu, dan kemudian pulih dari jeda; Fungsi Generator mengembalikan objek penjana, mempunyai ciri -ciri penilaian malas, dan dapat menyelamatkan ingatan. Ia sesuai untuk mengendalikan senario seperti fail besar, data streaming, dan urutan tak terhingga. Penjana adalah iterator yang menyokong seterusnya () dan untuk gelung, tetapi tidak boleh digulingkan dan mesti dicipta semula untuk berulang lagi.

ToseepythonoutputinaseparatePanelinsublimetext, usethebuilt-inbuildsystembysavingyourfilewitha.pyextensionAndpressingctrl b (orcmd b) .2.ensurethecorrectbuSelectedByGyGyGyGyToToToToToToToToToToToToToToToToToToToToToToToToToToToToToToToToToToToStoToToToToToToToToToToToToToSTORS

Toavoidgettingblockedwhilewebscrapingwithpython, usereAlisticRequestheaders, addrandomizeddelays, rotateipaddresseswithproxies, containsessions, hormatrobots.txt, anduseheadlessbrowsersshennerary, memastikanShicealhaviaviortommi
