Python stdin stdout stderr

Python学習【365日チャレンジ!】268日目のマスターU(@Udemy11)です。

11月は10月に続いて、魚がよく釣れる季節なんですよね。

アジに太刀魚にアオリイカに青物。

それぞれの釣り方は別々なので、一緒に釣ることができないのが悩みどころで、いつもどれを釣りに行こうか悩んじゃうんです。

アジはポイントさえ外さなければポツポツと釣れますし、太刀魚は朝まずめには何匹かは釣ることができます。

アオリイカもここのところ調子がよくありませんが、周りの人はポツポツと上げていました。

青物だけはくじ引きみたいな感じで、なかなかあたりの日に巡り会わないんですよね。

そろそろあの強烈な引きを味わいたいんですけどね。

それでは、今日もPython学習を始めましょう。

昨日の復習

昨日は、例外処理をスマートに処理できるcontextlib.suppressを学習しました。

context.suppressは、withステートメントを使ってシンプルに例外処理を扱うことができましたが、例外自体を無視してしまうので、問題がないとわかっている例外限定で使用する必要がありました。

例外(=問題)を無視するのはあまりお勧めできませんから。

詳細については昨日の記事をごらんください。

今日は、値の受け渡しに関わるstdinstdout、エラーのコントロールに関わるstderrを学習します。

ストリーム

stdinstdoutstderrは入力を行うターミナルや出力結果を表示するディスプレイとプログラムを実行するプロセスをつなぐ入出力チャンネルで、標準ストリームと呼ばれています。

この標準ストリームはUNIXやUnix系OSであらかじめ用意されていて、データの入出力に常に関わっています。

システムに組み込まれているので、sysをインポートして使うことができます。

stdin

stdinは、データをプロセスに渡す際に利用されています。

次のコードの場合、コンソールでユーザーの入力を要求して、入力が完了すると、入力した値が出力されました。

x = input('Your name:')
print(x)

出力結果

Your name:MasterU ※エンターで入力を完了すると次の行が出力される
MasterU

この処理にはstdinが使われているので、stdinを使って入力した値を出力することもできます。

import sys

for line in sys.stdin:
    print(line)

出力結果

MasterU ※エンターで入力を完了すると次の行が出力される
MasterU

forループを使ってstdinの入力を待ってから、入力された値を出力しています。

これまでの入力もシステムの裏でstdinが働いていたということですね。

stdout

次にstdoutですが、上記のコードでもすでに使われているprint出力で使われていますので、最初のコードを次のように変えても同じ結果が出力されます

import sys

x = input('Your name:')
sys.stdout.write(x)

出力結果

Your name:MasterU ※エンターで入力を完了すると次の行が出力される
MasterU

stdoutは値を保持しているだけなので、writeメソッドを使って入力された値を出力しています。

stderr

もう一つは、stderrですが、logging.error()で値を出力するように、stderr.writeメソッドを使って受け取った値を出力することができます。

import logging
import sys

logging.error('Error')
sys.stderr.write('Error')

出力結果

Error
Error

stderrは値を保持しているだけなので、writeメソッドを使って入力された値を出力しています。

受け取る値に文字列を入れていますが、stderrは、発生したエラーの値を受け取ります。

まとめ

何気なく使用している入力と出力ですが、システムの裏ではstdinstdoutstderrといったストリームが活躍していたわけですね。

個人的にはあまり使うことはなくて、システムがこんな値を使って処理をしているということを理解しておく程度でいいのかなとおもっています。

実践で使う場面に出会わないと覚えられないので、そんなに真剣にならなくても大丈夫な気がしてきた今日この頃です。

少し気が緩みがちですが、明日もGood Python!