やっとわかった。
成果物
手順
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