2014-02-14 40 views
3

我是一位學習Python的Perl程序員。我正在使用Python 2.7.3在python -m pdb script.py的emacs調試中編寫我的代碼。

我想知道什麼是python相當於在Perl中添加$DB::single=1;1;到特定的python代碼行,以便運行調試器時,它將停止在那裏,即使它是從不同的源代碼文件開始執行(例如,script.py使用庫中的一行代碼)。

任何想法?

編輯:在看pdb.set_trace()ipdb.set_trace()後,我認爲他們是很好的解決方案,但與$DB::single=1;1;的行爲不完全相同。這是,我想斷點是在set_trace行,而不是下一行。這是在Perl的$DB::single=1;中通過在同一行中添加另一個語句來完成的:1;,這使得它成爲$DB::single=1;1;

使用set_trace(),我得到語句後一行的斷點,即使我在它後面加上1;。仍然不完全理解Python與Perl相比如何處理多語句行。

有人嗎?

enter image description here

任何想法?

+0

嗨,你是否嘗試使用'C-x SPACE'(在python緩衝區中)設置斷點,注意你需要讓pdb運行這個工作。 – 2014-02-14 16:20:59

+1

爲什麼斷點在下一行?爲什麼這些功能必須與Perl的功能相同? – jpkotta

+0

jpkotta,它是美容,但我想要一個靜態斷點,實際上使調試器停在那裏,而不是在下一個語句。例如,如果在下一個語句之前有1000行註釋,那麼斷點和下一個語句之間的距離會很煩人。 – 719016

回答

2

Python附帶名爲pdb的調試器。要在代碼中給出點停止腳本把下面

import pdb; pdb.set_trace() 

由於您使用emacs,您要可能想嘗試通過gud.el校正提供的命令pdb:你不需要預裝「 python-mode'運行pdb,謝謝@AndreasRöhler的更正)。通過pdb name_of_script.py啓動它,然後您可以通過按C-xSPACE來設置您想要設置斷點的行處的emacs斷點。我建議您使用menu-bar來探索調試器提供的命令(GUD)。您還可以使用由emacs啓動的*gud-pdb*緩衝區中通常的pdb命令。

+0

準確地說:pdb不是由python-mode提供的,它是'gud.el'中的交互式自動加載Lisp函數。這意味着:您可以隨時從pdb運行程序,不需要python模式預加載。 –

+0

嗨,@AndreasRöhler感謝您的更正 – 2014-02-15 09:05:08

6

以下是否滿足您的需求?

import ipdb; ipdb.set_trace() 

只寫它的地方,在你的代碼,並與python script.py運行你的腳本。

需要IPython的調試器(ipython是一種增強的Python解釋器):

pip install ipdb 

編輯:你知道,如果你運行M-x pdb RET pdb myscript.py RET,你就會有一個PDB提示和emacs將跟蹤源代碼在另一個緩衝區中,但它不會停止在您定義的位置ipdb.set_trace()

虛擬環境?

如果您使用虛擬envs,您有幾個選項。我建議從ELPA安裝virtualenvwrapper並運行M-x venv-workon

+0

我使用'M-x pdb RET python -m pdb myscript.py RET'。 – 719016