masuk ke interpreter python saat menjalankan fungsi


90

saya memiliki modul python dengan fungsi:

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

apakah ada cara untuk masuk ke penerjemah baris perintah di mana saya mendapat komentar? sehingga jika saya menjalankan berikut ini dengan python:

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

saya mendapatkan prompt saya berikutnya dalam ruang lingkup dan konteks di mana saya memiliki komentar do_stuff()?


Jawaban:


61

Memasukkan

import pdb; pdb.set_trace()

akan masuk ke debugger python pada saat itu

Lihat di sini: http://docs.python.org/library/pdb.html


pdbadalah python vanilla yang bagus; jika Anda memiliki ruang untuk membawa paket eksternal, ipdbbagus - fungsionalitas yang sama dengan debugger, tetapi dengan penyorotan sintaks, penyelesaian tab, dll. dari
ipython

Pembaruan - ipdbtidak digunakan lagi, saat ini saya menggunakan pdbpp( pdb++) , yang memiliki fitur serupa, dan bekerja dengan import pdb; pdb.set_trace()(yaitu menambal yang diimpor, jadi ini adalah pengganti drop-in)
driftcatcher

@hangtwenty: mengapa menurut Anda ipdbtidak digunakan lagi? Saya tidak dapat menemukan berita tentang itu.
Nick Matteo

@Kor ya, kamu benar. Saya ingat dengan jelas membaca di suatu tempat bahwa penulis telah memutuskan untuk berhenti memelihara proyek dan menunjuk ke proyek lain untuk digunakan. Mungkin itu terjadi sebentar dan kemudian dibangkitkan? Saya bisa saja salah! Dalam kedua kasus, saya menikmati ipdbsebelumnya, tetapi telah menikmatinya pdbppsejak
driftcatcher

144

Jika Anda menginginkan prompt interaktif standar (bukan debugger, seperti yang ditunjukkan oleh prestomation), Anda dapat melakukan ini:

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

Lihat: modul kode .

Jika Anda menginstal IPython, dan menginginkan shell IPython, Anda dapat melakukan ini untuk IPython> = 0.11:

import IPython; IPython.embed()

atau untuk versi yang lebih lama:

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

27
untuk IPython> = 0.11, tidak ada lagi modul Shell di IPython ... jadi mulailah menggunakan "import IPython; IPython.embed ()" sebagai gantinya.
evandrix

Apakah mungkin dilanjutkan setelah masuk code.interact(), ala PDB c(ontinue)?
Nick T

4
code.interact()adalah panggilan pemblokiran. Program Anda akan berhenti dan menunggu hingga selesai. Jika Anda keluar dari interpreter interaktif, program Anda harus dilanjutkan dengan pernyataan segera setelahnya.
Matt Anderson

1
Apa perbedaan antara prompt interaktif dan debugger?
StockB

1
@StockB Ini adalah prompt interaktif standar yang membuatnya penting. Debugger adalah sebuah prompt interaktif, tapi itu tidak sama. Dalam PDB, Anda tidak dapat melakukan pernyataan multi-baris, helpfungsi
bawaan

29

Jika Anda menginginkan penerjemah Python default, Anda bisa melakukannya

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

Ini akan memungkinkan akses ke penduduk lokal dan global.

Jika Anda ingin menggunakan interpreter IPython, IPShellEmbedsolusinya sudah usang . Saat ini yang berhasil adalah:

from IPython import embed
embed()

8
terima kasih, code.interact(local=dict(globals(), **locals()))jauh lebih baik daripada code.interact(local=locals())karena yang terakhir membuat Anda mengimpor ulang paket
s2t2

Jawaban ini bekerja lebih baik untuk saya karena saya menggunakan skrip bash untuk memanggil kode python saya. Saya tidak dapat berinteraksi dengan kode python saya menggunakan jawaban yang diterima. Terima kasih!
jonathanking
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.