7


1

FIFOでブロックするreadlineを取得する

fifoを作成します。

mkfifo tofetch

私はこのPythonコードを実行します:

fetchlistfile = file("tofetch", "r")
while 1:
    nextfetch = fetchlistfile.readline()
    print nextfetch

私が望むように、readlineで停止します。 走る:

echo "test" > tofetch

そして、私のプログラムはもう停止しません。 行を読み取り、ループを永久に続けます。 新しいデータがないときに、なぜ再び停止しないのですか?

また、「not fetchlistfile.closed」を調べてみましたが、書き込みのたびに再び開くことは気になりませんが、Pythonはfifoがまだ開いていると考えています。

1 Answer


4


readlineのドキュメントによると、ファイルの終わりにいる場合にのみ空の文字列を返します。 Closedは、ファイルの終わりとは異なります。 ファイルオブジェクトは、.close()を呼び出したときにのみ閉じられます。 コードがファイルの最後に達すると、readline()は空の文字列を返し続けます。

ファイルオブジェクトを反復子として使用する場合、Pythonは一度に1行を自動的に読み取り、ファイルの終わりで停止します。 このような:

fetchlistfile = file("tofetch", "r")
for nextfetch in fetchlistfile:
    print nextfetch

`echo" test "> tofetch`コマンドは名前付きパイプを開き、それに" test "を書き込み、パイプの終わりを閉じます。 パイプの書き込み側が閉じられているため、読み取り側はファイルの終わりを認識します。