やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

Pythonにおけるstdin読込の方法

 やっとわかった。

成果物

手順

1. コード作成

a.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
if __name__ == "__main__":
    import sys
    stdin = sys.stdin.read() # Ctrl+D キー押下で終了する
    print(stdin)  
chmod +x a.py

2-1. 実行(stdinなし)

./a.py

 stdinを入力する。たとえば以下。

A
    B
        C
^D
  • ^DCtrl+Dキー押下のこと。これによりEOFコードが送信され、stdin入力プロンプトが終了する(入力完了)
    • Ctrl+CだとKeyboardInterrupt例外発生してしまう
    • Ctrl+Zだと強制終了してしまう
  • 改行の入力はEnterキー押下
  • タブの入力はTabキー押下(Ctrl+V, Tabする必要なし)

 Ctrl+CだとKeyboardInterrupt例外発生してしまう。以下のように。

^CTraceback (most recent call last):
  File "./a.py", line 5, in <module>
    stdin = sys.stdin.read() # Ctrl + D
KeyboardInterrupt

 Ctrl+Zだと強制終了してしまう。以下のように。

^Z
[1]+  停止                  ./a.py

2-2. 実行(stdinあり)

echo -e "A\n\tB\n\t\tC" | ./a.py

2-3. 実行(python3)

python3 a.py

 同じくCtrl+Dで入力終了だった。

まとめ

  1. Pythonでstdinがないときにsys.stdin.read()すると入力を求められる
  2. そのとき必ずCtrl+Dで正常終了せねばならない
    • Ctrl+Cだと例外発生してしまう
    • Ctrl+Zだと強制終了してしまう
キー 結果
Ctrl+D 正常終了
Ctrl+C 例外発生
Ctrl+Z 強制終了

これまでの迷走

  • キーはOSや端末によって変わるかも?
  • これは誰の問題? Python? 端末? OS? 私?

所感

 Ctrl+D,Ctrl+C,Ctrl+Zがややこしくて覚えられない。EOF送信ならCtrl+Eにしてくれ。

対象環境

$ uname -a
Linux raspberrypi 4.19.75-v7l+ #1270 SMP Tue Sep 24 18:51:41 BST 2019 armv7l GNU/Linux