2

私はwin7ユーザーです。

command1 < infile > outfile*nix システムでのリダイレクト (のような) について誤って読んだ後、Windows (リンク) で同様のことができることを発見しました。また、python は、pipes(?) または stdin/stdout(?) を使用してこのようなことを行うこともできます。

これが Windows でどのように発生するのか理解できないので、質問があります。

ある種の独自の Windows プログラム (.exe) を使用しています。このプログラムは、ファイルにデータを追加できます。簡単にするために、次のようなものと同等であると仮定しましょう

while True:
    f = open('textfile.txt','a')
    f.write(repr(ctime()) + '\n')
    f.close()
    sleep(100)

質問: このファイル (textfile.txt) を stdin として使用できますか? つまり、スクリプトは (実行中) 常に (一度ではなく) すべての新しいデータを処理する必要があります。つまり、

「終わりのないサイクル」では:

  • プログラム (.exe) が何かを書き込みます。

  • Python スクリプトがデータとプロセスをキャプチャします。

これをPythonで行う方法、またはおそらくwin cmd/.batまたはその他の方法で書いてください。

これはめちゃくちゃクールなことです。やり方を知りたい!:D

4

4 に答える 4

2

私があなたの質問を正しく読んでいるなら、あなたはあるコマンドから別のコマンドに出力をパイプしたいと思うでしょう。

これは通常、次のように行われます。

cmd1 | cmd2

ただし、プログラムはファイルにのみ書き込むと言います。ドキュメントを再確認して、ファイルではなくstdoutに書き込むコマンドを取得する方法ではないかどうかを確認します。

これが不可能な場合は、として知られているものを作成できますnamed pipe。これはファイルシステム上でファイルとして表示されますが、実際には書き込みと読み取りが可能なデータの単なるバッファーです(データはストリームであり、一度だけ読み取ることができます)。プログラムの読み取りは、パイプへのプログラムの書き込みが停止して「ファイル」を閉じるまで終了しません。Windowsの名前付きパイプの経験がないので、新しい質問をする必要があります。パイプの欠点の1つは、バッファサイズが制限されていることです。したがって、パイプからデータを読み取るプログラムがない場合、バッファがいっぱいになると、書き込みプログラムは続行できなくなり、プログラムがパイプからの読み取りを開始するまで無期限に待機します。

別の方法として、Unixにはtail、ファイルの変更を継続的に監視し、ファイルに追加されたデータを(短い遅延で)出力するように設定できるというプログラムがあります。

tail --follow=textfile.txt --retry | mycmd 
# wait for data to be appended to the file and output new data to mycmd

cmd1 >> textfile.txt # append output to file

これについて注意すべきことの1つはtail、最初のコマンドがファイルへの書き込みを停止したからといって停止しないということです。tailそのファイルの変更を永久に、またはmycmdがリッスンを停止するまでtail、または強制終了されるまでtail(または「sigint-ed」されるまで)リッスンし続けます。

この質問tailには、Windowsマシンにバージョンを取得する方法に関するさまざまな回答があります。

于 2012-11-27T10:26:13.383 に答える
0
import sys
sys.stdin = open('textfile.txt', 'r')
for line in sys.stdin:
    process(line)
于 2012-11-27T10:02:56.133 に答える
0

<ファイルの出力を Python スクリプトに送信するために使用する場合、そのスクリプトはそのデータをそのstdinストリームで受け取ります。

から読み取るだけで、sys.stdinそのデータを取得できます。

import sys
for line in sys.stdin:
    # do something with line
于 2012-11-27T10:08:22.903 に答える
0

プログラムが に書き込む場合、プログラムを再コンパイルしない限り、それを Python スクリプトのtextfile.txtにリダイレクトするように変更することはできません。stdin

プログラムを編集する場合stdout、ファイル システム上のファイルではなく、に書き込む必要があります。そうすれば、リダイレクト演算子を使用して、Python スクリプト (この場合は|演算子) にフィードすることができます。

それができないと仮定すると、テキスト ファイルの変更をポーリングし、最後に更新されたときの読み取り量を追跡することによって、新しく書き込まれたデータのみを使用するプログラムを作成できます。

于 2012-11-27T10:08:09.893 に答える