Python kodundan REPL'e (Oku, Değerlendir, Yazdır, Döngü) nasıl girilir


109

Bir Python betiğini, komut satırı komut satırından başlatılmış olsa bile, yürütme sırasında rastgele bir noktada bir REPL'ye düşmeye programlı olarak zorlamanın bir yolu var mı?

Hızlı ve kirli bir çizim programı yazıyorum, verileri stdin'den veya bir dosyadan okumak, grafiğini çizmek ve ardından grafiğin özelleştirilmesine izin vermek için REPL'e bırakmak istiyorum.

Yanıtlar:


105

Python için etkileşimli seçeneği kullanmayı deneyebilirsiniz:

python -i program.py

Bu, program.py'deki kodu çalıştıracak ve ardından REPL'e gidecektir. Program.py'nin en üst düzeyinde tanımladığınız veya içe aktardığınız her şey mevcut olacaktır.


21
Karanlık tarafa geçmeye hazır olduğunuzda, ipython -i program.py sizin için oradadır.
joeforker

Etkileyici ve basit.
Nishant

127

Bunu sık sık kullanıyorum:

def interact():
    import code
    code.InteractiveConsole(locals=globals()).interact()

47
Bunu daha da basit bir şekilde yapabilirsiniz: kodu içe aktarın; code.interact (yerel = yereller ())
Steven Kryskalla

3
İçerisinde pdbkullanabilirsiniz interact.
gerrit

43

İşte bunu nasıl yapmalısınız (IPython> v0.11):

import IPython
IPython.embed()

IPython <= v0.11 için:

from IPython.Shell import IPShellEmbed

ipshell = IPShellEmbed()

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

Python REPL'lerin Cadillac'ı olan IPython'u kullanmalısınız. Görmek http://ipython.org/ipython-doc/stable/interactive/reference.html#embedding-ipython

Belgelerden:

Ayrıca, otomatik, hesaplama açısından yoğun bir bölüm yapmanın ve ardından verilere, grafiklere vb. Bakmanın yaygın olduğu bilimsel hesaplama durumlarında da yararlı olabilir. Bir IPython örneğini açmak, verilerinize ve işlevlerinize tam erişim sağlar. ve interaktif bölümle işiniz bittiğinde programın yürütülmesine devam edebilirsiniz (belki daha sonra, gerektiği kadar çok kez durdurabilirsiniz).


3
IPython harikadır, ancak OP yalnızca yerleşik Python kullanan bir çözüm istiyorsa, Jason'ın kodu.InteractiveConsole () çözümü, bunu nasıl "yapmanız gerektiğidir". :-)
Ben Hoyt

18

İPython'u ve hata ayıklayıcının işlevselliğini kullanmak için ipdb kullanmanız gerekir ,

Aşağıdakilerin eklenmesiyle pdb ile aynı şekilde kullanabilirsiniz:

import ipdb
ipdb.set_trace()

17

Hata ayıklayıcıyı başlatabilirsiniz:

import pdb;pdb.set_trace() 

REPL'i ne için istediğinizden emin değilim, ancak hata ayıklayıcı çok benzer.


3
Lisp gibi devam eden bir süreçte canlı değişiklikler yapmak istediğinden şüpheleniyorum.
Pinochle

1
Sizi pdb'ye başlatan betiği çalıştırmaya devam etmenin bir yolu var mı?
Jeff Welling

1
Python'un kurduğu VIM'de kod parçacığı yazma eğilimindeyim, kaydedin ve sonra örneğin bir! Python -i% yapın. Veya pdb. Bu iyi bir kullanım durumu.
Nishant

0

Bunu kendi komut dosyalarımdan birinde yaptım (enstrümana göre çok büyük bir PITA olan bir otomasyon çerçevesi içinde çalışıyor):

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

Bunu bir kesme noktası istediğiniz yere koyun ve durumu python yorumlayıcısıyla aynı sözdizimini kullanarak kontrol edebilirsiniz (modül içe aktarmanıza izin vermiyor gibi görünse de). Çok zarif değil ama başka bir kurulum gerektirmiyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.