2012-02-07 7 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は、その後、私は私のスクリプトを実行できる2本のライン、

$ 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を()()入れて、その後、私は得る私の質問は、おそらくthis questionに関連していることを

$ 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 

注(すなわち、PDB、デフォルトでは標準入力から読み込み)が、私はより多くの助けを必要としています。

答えて

3

問題は:catあなたのスクリプトが現在デバッグ中であるため、データ送信を停止しません。トレースすると、stdinはまだcat +キーボードで埋められます。あなたはそれらの1つを選ぶ必要があります。

あなたが標準入力によって満たされていないことになる全体の標準入力を読み、その後、set_trace()することができます

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

これは役に立ちそうだが完全ではないようだ。私はsys.stdin.read()をいくつかの場所に置き、pdb.set_trace()を以下に置くと、私はもはやNameErrorを取得しません。しかし、pdbは開かない...それはちょうど終了する(NameErrorなしで上記と同じメッセージ) –

2

あなたはセロリのRDB(リモートデバッガ)のcontribモジュールがどのように機能するかを見てみたいことがあります。

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

ストリーム処理の多くを含んでいるようだが、私はそれをテストしている、そしてそれはあなたが新しいローカルネットワークポートにtelnetできるようにすることで動作します。はるかに優れたipdbではなく、単純にpdbです。

1

今日、私はこの正確な問題に遭遇しました。私はWinpdbが完璧に動作することを発見しました。ここで

+0

この場合、どのようにwinpdbを呼び出すのですか? –

13

は私のために働いていたものの一例です:ripdbモジュール(pip install ripdb)を使用して

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

私は同じ問題を抱えていました。誰でも知っている理由は? – unclejamil

+3

Pdbはstdinから読み込み、インタラクティブになります。 pdbを使用するには、最初にすべてのstdinを読み込んでからstdinをteletypeインターフェースに設定するか、シェルパイプの代わりに端末とキーボードに接続する必要があります。その時点で、通常のようにpdbを起動することができます(それを使用します) – ThorSummoner

+1

私は使用しました: 'import sys; sys.stdin = open( '/ dev/tty'); import pdb; pdb.set_trace() ' –

2

は私のために、この問題を解決しました。

関連する問題