結論
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()