31

stdin から引数を取ることができる、私が書いた Python CLI をデバッグしようとしています。単純なテスト ケースの出力は次のようになります。

echo "test" | python mytool.py

の出力と同等である

python mytool.py test

このツールでいくつかの問題をデバッグしたいので、これを実行しようとしました:

echo "test" | pdb mytool.py

しかし、私はこの出力を取得し、pdb は終了します:

> /path/to/mytool.py(5)<module>()
-> '''
(Pdb) *** NameError: name 'test' is not defined
(Pdb)

-m pythonシバンに追加したりpdb.set_trace()、スクリプト内で実行したりすると、同じことが起こります。

何が起きてる?

4

4 に答える 4

16

もう 1 つのオプションは、独自の Pdb オブジェクトを作成し、そこに stdin と stdout を設定することです。私の概念実証には 2 つの端末が含まれますが、いくつかの作業はある種の非常に安全でないネットワーク サーバーにマージされる可能性があることは確かです。

  1. 2 つの fifo を作成します。

    mkfifo fifo_stdin
    mkfifo fifo_stdout
    
  2. 1 つのターミナルで、バックグラウンドで stdout を開き、stdin に書き込みます。

    cat fifo_stdout &
    cat > fifo_stdin
    
  3. Python コード/コンソールで pdb オブジェクトを作成し、それを使用します。

    import pdb
    mypdb=pdb.Pdb(stdin=open('fifo_stdin','r'), stdout=open('fifo_stdout','w'))
    ...
    mypdb.set_trace()
    ...
    
  4. 利益!

最初のコンソールで pdb を使用できるはずです。

唯一の欠点は、カスタム pdb を使用する必要があることですが、init でモンキー パッチ (PYTHONSTARTUP など) を適用すると、次のことが役立ちます。

import pdb
mypdb=pdb.Pdb(stdin=open('fifo_stdin','r'), stdout=open('fifo_stdout','w'))
pdb.set_trace=mypdb.set_trace
于 2014-11-17T15:15:59.767 に答える
2

pdb(または他のpythonデバッガー)を使用するstdinと、デバッグコマンド用 に取得されるため、 NameError: name 'test' is not defined.

たとえば、このコマンドはランタイムの開始時にデバッガーを終了し、1 回の実行でこのエラー (対話型デバッグも) を取得しません。

(echo cont;echo "test") | python -m pdb mytool.py

于 2014-11-14T16:04:30.763 に答える