Cara masuk ke REPL (Read, Eval, Print, Loop) dari kode Python

109

Apakah ada cara untuk memaksa skrip Python secara terprogram jatuh ke REPL pada titik arbitrer dalam pelaksanaannya, bahkan jika skrip diluncurkan dari baris perintah?

Saya sedang menulis program penggambaran cepat dan kotor, yang saya ingin membaca data dari stdin atau file, memplotnya, dan kemudian memasukkannya ke dalam REPL untuk memungkinkan plotnya disesuaikan.

dsimcha
sumber

Jawaban:

105

Anda dapat mencoba menggunakan opsi interaktif untuk python:

python -i program.py

Ini akan mengeksekusi kode di program.py, lalu pergi ke REPL. Apa pun yang Anda tentukan atau impor di tingkat atas program.py akan tersedia.

Alex
sumber
21
Saat Anda siap untuk beralih ke sisi gelap, ipython -i program.py ada untuk Anda.
joeforker
Mengesankan dan sederhana.
Nishant
127

Saya sering menggunakan ini:

def interact():
    import code
    code.InteractiveConsole(locals=globals()).interact()
Jason R. Coombs
sumber
47
Anda dapat melakukannya lebih sederhana dari itu: kode impor; code.interact (local = penduduk lokal ())
Steven Kryskalla
3
Di dalam pdb, Anda bisa menggunakan interact.
gerrit
43

Inilah cara Anda melakukannya (IPython> v0.11):

import IPython
IPython.embed()

Untuk IPython <= v0.11:

from IPython.Shell import IPShellEmbed

ipshell = IPShellEmbed()

ipshell() # this call anywhere in your program will start IPython

Anda harus menggunakan IPython, Cadillac dari Python REPL. Lihat http://ipython.org/ipython-doc/stable/interactive/reference.html#embedding-ipython

Dari dokumentasi:

Ini juga dapat berguna dalam situasi komputasi ilmiah di mana biasanya perlu melakukan beberapa bagian intensif komputasi otomatis dan kemudian berhenti untuk melihat data, plot, dll. Membuka instans IPython akan memberi Anda akses penuh ke data dan fungsi Anda, dan Anda dapat melanjutkan eksekusi program setelah Anda selesai dengan bagian interaktif (mungkin untuk berhenti lagi nanti, sebanyak yang diperlukan).

joeforker
sumber
3
IPython hebat, tetapi jika OP menginginkan solusi yang hanya menggunakan Python bawaan, solusi kode Jason.InteractiveConsole () adalah bagaimana Anda "harus" melakukannya. :-)
Ben Hoyt
18

Untuk menggunakan iPython dan fungsionalitas debugger Anda harus menggunakan ipdb ,

Anda dapat menggunakannya dengan cara yang sama seperti pdb, dengan tambahan:

import ipdb
ipdb.set_trace()
bluszcz.dll
sumber
17

Anda dapat meluncurkan debugger:

import pdb;pdb.set_trace() 

Tidak yakin untuk apa Anda menginginkan REPL, tetapi debuggernya sangat mirip.

Ned Batchelder
sumber
3
Saya curiga dia ingin membuat perubahan langsung pada proses yang sedang berjalan, à la Lisp.
Pinochle
1
Apakah ada cara untuk melanjutkan menjalankan skrip yang meluncurkan Anda ke pdb?
Jeff Welling
1
Saya cenderung menulis potongan kode di VIM dengan menggunakan Python, simpan dan kemudian lakukan! Python -i% misalnya. Atau pdb. Itu kasus penggunaan yang bagus.
Nishant
0

Saya baru saja melakukan ini di salah satu skrip saya sendiri (ini berjalan di dalam kerangka kerja otomatisasi yang merupakan PITA besar untuk instrumen):

x = 0 # exit loop counter
while x == 0:
    user_input = raw_input("Please enter a command, or press q to quit: ")
    if user_input[0] == "q":
        x = 1
    else:
        try:
            print eval(user_input)
        except:
            print "I can't do that, Dave."
            continue

Letakkan saja ini di mana pun Anda ingin breakpoint, dan Anda dapat memeriksa status menggunakan sintaks yang sama dengan interpreter python (meskipun tampaknya tidak memungkinkan Anda melakukan impor modul). Ini tidak terlalu elegan, tetapi tidak memerlukan pengaturan lain.

pisau cukur
sumber