私はいくつかのPythonプログラミングを行っていますが、あるプログラムの出力を別のプログラムに「パイプ」したいと思います。これは、sys.stdinとsys.stdoutを使用して簡単に実行できます。ただし、端末に情報や警告メッセージを出力できるようにしたいと思います。メッセージを端末に出力し、データを別のプログラムに送信して、複数のチャネルを作成する(簡単な)方法はありますか?
4 に答える
stderr
端末出力とstdout
パイプに使用できます。
subprocess.Popenが役に立つかもしれません。別のプログラムを別のプロセスとして生成し、必要に応じて および のファイル記述子を定義stdin
できstdout
ますstderr
。
これは、logging
モジュールが構築されているほとんどの目的です。コード内の任意の場所から任意に作成して名前を付けることができるロガーにメッセージを記録し、ロガーにハンドラーをアタッチすることで、必要なコンシューマーにデータをプッシュできます。
それがうまくいかない場合は、moooeeeep のサブプロセスの提案がおそらく次善の方法です。これは、sys.stdout を上書きするのと同じことを達成する文明化された方法のようなものです。これは、野蛮人と病弱な人だけが行うべきことです。
他の人が言ったようstdout
に、データとstderr
ユーザーインタラクションに使用します。最近のPythonバージョン(つまり、3.xおよび2.6以降)でこれを行う方法は次のとおりです。
import sys
print("data", file=sys.stdout)
print("more data") # sys.stdout is the default
print("user interaction", file=sys.stderr)
結果:
#!/usr/bin/env python
desktop➜ ~ ./tmp.py
data
more data
user interaction
desktop➜ ~ ./tmp.py > /dev/null
user interaction
desktop➜ ~ ./tmp.py 2&> /dev/null
data
more data
正直なところ、これをすばやく実行したい場合は、コードを混乱させることなく、teeを使用します。その*nixユーティリティは、表示と配管のためにパイプを分割することについて話していることを実行します。grepを使用して、表示する内容をさらに制限することができます。パイプを使用するもののデバッグに最適です。これが本番システムの一部である場合、必要がない限り、パイプを使用して情報を渡すことはおそらくないでしょう。その場合は、エラー/警告をログに記録し、ログを末尾に追加します。
私は実際にはPythonの答えを知りませんが、それは仕事を成し遂げます。