やっとわかった。
成果物
手順
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
^DはCtrl+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で入力終了だった。
まとめ
- Pythonでstdinがないときに
sys.stdin.read()すると入力を求められる - そのとき必ず
Ctrl+Dで正常終了せねばならないCtrl+Cだと例外発生してしまうCtrl+Zだと強制終了してしまう
| キー | 結果 |
|---|---|
| Ctrl+D | 正常終了 |
| Ctrl+C | 例外発生 |
| Ctrl+Z | 強制終了 |
これまでの迷走
- Pythonのstdinは値がないときに読むと永久待機してしまう
- C#のstdinは値がないときに読むと永久待機してしまう
- プログラミング言語で作ったCLIコマンドにstdinを渡す方法を考えてみた
- ツリーテキストをプログラミング言語で作ったCLIコマンドに渡す方法を考えてみた
- 端末にタブを入力する方法
- 複数行テキストをエディタから入力する方法
謎
- キーはOSや端末によって変わるかも?
- これは誰の問題? Python? 端末? OS? 私?
所感
Ctrl+D,Ctrl+C,Ctrl+Zがややこしくて覚えられない。EOF送信ならCtrl+Eにしてくれ。
対象環境
- Raspbierry pi 4 Model B
- Raspbian buster 10.0 2019-09-26 ※
- bash 5.0.3(1)-release
- Python 2.7.16
- Python 3.7.3
$ uname -a Linux raspberrypi 4.19.75-v7l+ #1270 SMP Tue Sep 24 18:51:41 BST 2019 armv7l GNU/Linux