2012-02-07 41 views
25

我有一個通過管道讀取stdin的python腳本,我似乎無法將它與pdb.set_trace()一起使用。在通過管道讀取stdin的腳本中使用pdb.set_trace()

my_script.py:

#!/usr/bin/env python 
import sys 
import pdb 

def main(): 
    for line in sys.stdin: 
     print "Printing a line: " +line 

if __name__=='__main__': 
    status = main() 

假設tempfile.csv是一些文件有兩行,

$ cat tempfile.csv 
line1 
line2 

然後我可以運行我的腳本: $貓tempfile.csv | ./my_script.py,並且一切都很好:

$ cat tempfile.csv | ./my_script.py 
Printing a line: line1 

Printing a line: line2 

在另一方面,如果我把pdb.set_trace()的任何地方,然後我得到一個錯誤。例如,把下面的高清主(pdb.set_trace()),然後我得到

$ cat tempfile.csv | ./my_script.py 
> /home/ilangmore/mobiuss/TM/branches/hadooprotype/my_script.py(7)main() 
-> for line in sys.stdin: 
(Pdb) *** NameError: name 'line1' is not defined 
(Pdb) *** NameError: name 'line2' is not defined 
(Pdb) 
Traceback (most recent call last): 
    File "./my_script.py", line 11, in <module> 
    status = main() 
    File "./my_script.py", line 7, in main 
    for line in sys.stdin: 
    File "./my_script.py", line 7, in main 
    for line in sys.stdin: 
    File "/usr/lib/python2.7/bdb.py", line 48, in trace_dispatch 
    return self.dispatch_line(frame) 
    File "/usr/lib/python2.7/bdb.py", line 67, in dispatch_line 
    if self.quitting: raise BdbQuit 
bdb.BdbQuit 

請注意,我的問題是可能與this question(即PDB默認情況下從標準輸入讀取),但我需要更多的幫助。

回答

3

事情是:cat不會停止發送數據,因爲您的腳本當前正在調試。而當你要追蹤時,標準輸入仍然由cat +你的鍵盤填充。你需要選擇其中之一。

您可以讀取整個標準輸入,然後,set_trace()將不受標準輸入填充:

sys.stdin.read() 
pdb.set_trace() 
+2

這似乎有幫助,但不完全。我將sys.stdin.read()放在幾個地方,並在下面放置了pdb.set_trace(),我不再得到NameError。但是,pdb不會打開......它只是退出(與上面相同的消息,沒有NameError) – 2012-02-07 16:14:06

2

你可能想看看如何芹菜RDB(遠程調試器)的contrib模塊的工作原理:

https://github.com/celery/celery/blob/master/celery/contrib/rdb.py

這似乎涉及到很多個流處理的,但我已經測試過它,它的工作原理是讓你遠程登錄到一個新的本地網絡端口。這不是更好的ipdb,而只是pdb。

1

今天我遇到了這個確切的問題。我發現Winpdb完美。

+0

在這種情況下如何調用winpdb? – 2014-10-09 11:30:54

13

這裏是爲我工作的例子:

lines = sys.stdin.readlines() 
sys.stdin = open('/dev/tty') 
pdb.set_trace() 
+0

我有同樣的問題,這很好。有人知道爲什麼 – unclejamil 2016-03-06 02:35:35

+3

Pdb從stdin讀取以進行交互;所以要使用pdb,你必須先讀取所有的標準輸入,然後設置標準輸入爲電傳輸接口,或者換句話說,將它連接到你的終端和鍵盤,而不是外殼管道。在這一點上,你可以像正常一樣啓動pdb(並使用它) – ThorSummoner 2016-05-24 20:39:28

+1

我用過: 'import sys; sys.stdin = open('/ dev/tty');導入pdb; pdb.set_trace()' – 2017-10-11 15:14:03

2

使用ripdb模塊(pip install ripdb)解決了這個問題對我來說。

相關問題