簡體   English   中英

在 Python 中進入交互模式

[英]Enter Interactive Mode In Python

我正在運行我的 Python 程序,並且有一點需要跳進去看看發生了什么,然后再退出。 有點像臨時控制台模式。

在 Matlab 中,我會使用keyboard命令來執行此操作,但我不確定 python 中的命令是什么。

有沒有辦法做到這一點?

例如:

for thing in set_of_things:
    enter_interactive_mode_here()
    do_stuff_to(thing)

enter_interactive_mode()調用時,我想去那里,環顧四周,然后離開並讓程序繼續運行。

code.interact()似乎以某種方式工作:

>>> import code
>>> def foo():
...     a = 10
...     code.interact(local=locals())
...     return a
... 
>>> foo()
Python 3.6.5 (default, Apr  1 2018, 05:46:30) 
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> a
10

Ctrl + Z返回到“主”解釋器。

你可以閱讀當地人,但修改他們似乎並沒有這樣工作。

python -i myapp.py

這將執行myapp.py並將您放入交互式 shell。 從那里你可以執行函數並檢查它們的輸出,加載myapp.py的整個環境(導入等)。

對於更復雜的東西 - 最好使用像pdb這樣的調試器,設置斷點。 此外,大多數 IDE(PyDev、PyCharm、Komodo...)都有圖形調試器。

為此,我使用pdb 我知道 Emil 已經在他的回答中提到了這一點,但他沒有提供示例或詳細說明為什么它可以回答您的問題。

for thing in set_of_things:
    import pdb; pdb.set_trace()
    do_stuff_to(thing)

您可以通過以感嘆號開始命令來讀取和設置變量。 您還可以在堆棧中上下移動(命令ud ), InteractiveConsole沒有內置機制可以執行此操作。

要讓程序繼續執行,請使用c命令。 在上面的示例中,它會在每次循環迭代時進入調試器,因此您可能希望將set_trace()調用包裝在if語句中。

您有多種選擇——Python 標准庫或 IPython。

Python 標准庫有一個code模塊,它有一個InteractiveConsole類,其目的是“密切模擬交互式 Python 解釋器的行為”。 這可能可以做你想做的事,但文檔沒有任何關於如何使用它的例子,我也沒有關於去哪里的任何建議。

IPython是一個更高級的 Python 終端,可以選擇在內置程序的任何位置嵌入控制台。根據他們的文檔,您可以簡單地做

from IPython import embed

for thing in set_of_things:
  embed()
  do_stuff_to(thing)

從 Python 3.7 開始,您還可以使用breakpoint()進入調試器,例如:

for thing in set_of_things:
    breakpoint()
    do_stuff_to(thing)

這樣更容易記憶和編寫,默認情況下會在 pdb 中打開你的代碼。

但是,也可以將PYTHONBREAKPOINT環境設置為可調用的名稱,它可以是另一個調試器,例如pudbipdb ,也可以是 IPython 的embed ,或其他任何東西。

對我來說最舒服的工具是ipdb

ipdb 導出函數以訪問 IPython 調試器,它具有制表符完成、語法突出顯示、更好的回溯、更好的內省功能,與 pdb 模塊具有相同的接口。

完成和方便的內省對於調試特別有用。

您可以使用ipdb

要設置斷點,請添加import ipdb; ipdb.set_trace() import ipdb; ipdb.set_trace()你想跳轉到調試器的地方。 到達斷點后,您將獲得一個交互式 shell 和斷點周圍的幾行代碼以獲取上下文。

https://www.safaribooksonline.com/blog/2014/11/18/intro-python-debugger/

雖然它可能不是最合適的選擇,但有些簡單:

try:
    while True:
        print input()
except:
    pass

將涵蓋許多案件

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM