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()?

aaronstacy
sumber
Kemungkinan duplikat Masuk Mode Interaktif Dengan Python
Fisikawan Gila

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

prestomation
sumber
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())
Matt Anderson
sumber
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()
Ronan Paixão
sumber
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