2011-10-06 104 views
21

我經常會遇到這樣的情況:我將編寫一個腳本,然後我將腳本放到腳本的一部分中,我希望以交互方式處理一些變量。進入該部分需要運行我已經編寫的大部分腳本。python:從程序運行交互式python shell

在這種情況下,從shell內部運行該程序並不是微不足道的。我必須以某種方式重新創建該功能的條件。

我想要做的就是調用一個函數,如runshell(),它將在程序中的那一刻運行python shell,將所有變量保持在範圍內,從而允許我在其中探索。

我該怎麼做呢?

+0

您是否在談論使用Python調試器?或者您是否在尋找關於如何將大型腳本分解爲更易於管理的部分的設計建議? –

+0

我在問前者 - 我忘了那個詞('調試器')! – Claudiu

+0

[跳轉到Python交互式會話中程序?](http://stackoverflow.com/questions/925832/jump-into-a-python-interactive-session-mid-program) –

回答

37
import code 

code.interact(local=locals()) 

但使用Python調試器是可能更多你想要什麼:

import pdb 

pdb.set_trace() 
+0

謝謝!我正在尋找這一段時間!導入代碼 – zx1986

+0

如果你在PDB會話的斷點處,並且想從那裏下降到一個交互式Python shell中,那麼'import code; code.interact(local = locals())'事情對此很完美。當您點擊^ D並返回到調試會話時,交互式shell中定義的變量和函數就可用。非常感謝Michael Hoffman。 –

5

您可以使用Python調試器(pdbset_trace功能。

例如,如果你調用一個這樣的腳本:

def whatever(): 
    x = 3 
    import pdb 
    pdb.set_trace() 

if __name__ == '__main__': 
    whatever() 

您在點得到的範圍時set_trace叫做:

$ python ~/test/test.py 
--Return-- 
> /home/jterrace/test/test.py(52)whatever()->None 
-> pdb.set_trace() 
(Pdb) x 
3 
(Pdb) 
4

實用的角度來看,我想補充一點,你可以把調試痕量的一個班輪:

import pdb; pdb.set_trace() 

這是一個很好行添加到編輯器支持片段,如TextMate或Vim + SnipMate。我已經設置了將「休息」擴展到上面的一個班輪。

+0

是的這是我現在最終做的 – Claudiu

12

到目前爲止,我已經找到了最方便的方法是:

import IPython 
IPython.embed() 

你得到你所有的全局和局部變量和IPython中的所有物質享受:標籤完成,自動縮進等

您必須安裝IPython模塊才能使用它:

pip install ipython 
+0

我喜歡這個,只有一個警告。我必須重做我的進口。任何方式來通過導入到新的交互式外殼? – kdauria