วิธีวางลงใน REPL (Read, Eval, Print, Loop) จากโค้ด Python


109

มีวิธีบังคับให้สคริปต์ Python โดยทางโปรแกรมวางลงใน REPL ณ จุดใดจุดหนึ่งในการดำเนินการแม้ว่าสคริปต์จะถูกเรียกใช้จากบรรทัดคำสั่งหรือไม่

ฉันกำลังเขียนโปรแกรมพล็อตที่รวดเร็วและสกปรกซึ่งฉันต้องการอ่านข้อมูลจาก stdin หรือไฟล์พล็อตแล้วปล่อยลงใน REPL เพื่อให้สามารถปรับแต่งพล็อตได้

คำตอบ:


105

คุณสามารถลองใช้ตัวเลือกแบบโต้ตอบสำหรับ python:

python -i program.py

เพื่อรันโค้ดใน program.py จากนั้นไปที่ REPL ทุกสิ่งที่คุณกำหนดหรือนำเข้าในระดับบนสุดของ program.py จะพร้อมใช้งาน


21
เมื่อคุณพร้อมที่จะเปลี่ยนไปใช้ด้านมืด ipython -i program.py พร้อมให้คุณ
joeforker

น่าประทับใจและเรียบง่าย
Nishant


43

นี่คือวิธีที่คุณควรทำ (IPython> v0.11):

import IPython
IPython.embed()

สำหรับ IPython <= v0.11:

from IPython.Shell import IPShellEmbed

ipshell = IPShellEmbed()

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

คุณควรใช้ IPython, Cadillac of Python REPLs ดูhttp://ipython.org/ipython-doc/stable/interactive/reference.html#embedding-ipython

จากเอกสารประกอบ:

นอกจากนี้ยังมีประโยชน์ในสถานการณ์การคำนวณทางวิทยาศาสตร์ซึ่งเป็นเรื่องปกติที่จะต้องทำงานอัตโนมัติบางส่วนที่ต้องใช้การคำนวณอย่างเข้มข้นจากนั้นหยุดดูข้อมูลพล็อตและอื่น ๆ การเปิดอินสแตนซ์ IPython จะทำให้คุณสามารถเข้าถึงข้อมูลและฟังก์ชันของคุณได้อย่างเต็มที่ และคุณสามารถดำเนินการโปรแกรมต่อได้เมื่อคุณทำส่วนโต้ตอบเสร็จแล้ว (อาจจะหยุดอีกครั้งในภายหลังหลาย ๆ ครั้งได้ตามต้องการ)


3
IPython นั้นยอดเยี่ยมมาก แต่ถ้า OP ต้องการโซลูชันที่ใช้เฉพาะ Python ในตัวโค้ดของ Jason โซลูชัน InteractiveConsole () คือวิธีที่คุณ "ควร" ทำ :-)
Ben Hoyt

18

ที่จะได้รับการใช้งานของ IPython และการทำงานของดีบักคุณควรใช้ipdb ,

คุณสามารถใช้มันในลักษณะเดียวกับ pdb โดยเพิ่ม:

import ipdb
ipdb.set_trace()

17

คุณสามารถเปิดตัวดีบักเกอร์:

import pdb;pdb.set_trace() 

ไม่แน่ใจว่าคุณต้องการ REPL สำหรับอะไร แต่ดีบักเกอร์นั้นคล้ายกันมาก


3
ฉันสงสัยว่าเขาต้องการเปลี่ยนแปลงกระบวนการที่กำลังทำงานอยู่à la Lisp
Pinochle

1
มีวิธีใดบ้างในการเรียกใช้สคริปต์ที่เรียกใช้คุณเข้าสู่ pdb ต่อไป
Jeff Welling

1
ฉันมักจะเขียนข้อมูลโค้ดใน VIM instaed ของ Python บันทึกไว้แล้วทำ! python -i% เป็นต้น หรือ pdb. นั่นเป็นกรณีการใช้งานที่ดี
Nishant

0

ฉันเพิ่งทำสิ่งนี้ในสคริปต์ของฉันเอง (มันทำงานในกรอบการทำงานอัตโนมัติที่เป็นเครื่องมือขนาดใหญ่ของ PITA):

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

เพียงวางสิ่งนี้ทุกที่ที่คุณต้องการเบรกพอยต์และคุณสามารถตรวจสอบสถานะโดยใช้ไวยากรณ์เดียวกันกับตัวแปล python (แม้ว่าดูเหมือนจะไม่อนุญาตให้คุณนำเข้าโมดูลก็ตาม) มันไม่สวยหรูมาก แต่ไม่จำเป็นต้องมีการตั้งค่าอื่น ๆ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.