LoginSignup
0
0

[Python]入力リダイレクトとpdbデバッガとの併用

Posted at

結論

pythonで入力リダイレクト(ex. python main.py < input.txt)とpdbデバッガを併用するには、sys.stdin = open('/dev/tty', 'r')を使用する。

sys.stdin = open('/dev/tty', 'r')
import pdb; pdb.set_trace()

内容

AtCoderなどでpythonスクリプトが入力を受け取る際、入力をtxtファイルに記述して実行時にリダイレクトすると便利だが、pdbデバッガと併用すると以下のようにエラーが発生する。

input.txt
10
main.py
N = int(input())
print(N)
import pdb; pdb.set_trace()
python main.py < input.txt
10
--Return--
> /app/tmp/main.py(3)<module>()->None
-> import pdb; pdb.set_trace()
(Pdb) 
Traceback (most recent call last):
  File "/app/tmp/main.py", line 3, in <module>
    import pdb; pdb.set_trace()
  File "/usr/local/lib/python3.9/bdb.py", line 92, in trace_dispatch
    return self.dispatch_return(frame, arg)
  File "/usr/local/lib/python3.9/bdb.py", line 154, in dispatch_return
    if self.quitting: raise BdbQuit
bdb.BdbQuit

これはpdbで使用する入出力がリダイレクトによってファイル入力になってしまっているため。
標準入力をターミナルに戻すためにsys.stdin = open('/dev/tty', 'r')を使用する。

main.py
import sys
N = int(input())
print(N)
sys.stdin = open('/dev/tty', 'r')
import pdb; pdb.set_trace()
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0