- Pythonはどのくらいの頻度でファイルにフラッシュしますか?
- Pythonはどのくらいの頻度で標準出力にフラッシュしますか?
(1)についてはわかりません。
(2)に関しては、Pythonは新しい行ごとにstdoutにフラッシュすると思います。しかし、stdoutをオーバーロードしてファイルにした場合、それは頻繁にフラッシュされますか?
(1)についてはわかりません。
(2)に関しては、Pythonは新しい行ごとにstdoutにフラッシュすると思います。しかし、stdoutをオーバーロードしてファイルにした場合、それは頻繁にフラッシュされますか?
回答:
ファイル操作の場合、特に設定しない限り、Pythonはオペレーティングシステムのデフォルトのバッファリングを使用します。バッファサイズ、バッファなし、またはラインバッファ付きを指定できます。
たとえば、open関数はバッファサイズ引数を取ります。
http://docs.python.org/library/functions.html#open
「オプションのバッファリング引数は、ファイルの必要なバッファサイズを指定します。」
コード:
bufsize = 0
f = open('file.txt', 'w', buffering=bufsize)
open('file.txt', 'w', 1)
と、適切なラインバッファリングが得られます。しかし、私がもっと大きなことをした場合(私が欲しかったopen('file.txt', 'w', 512)
)それは完全にバッファリングしますio.DEFAULT_BUFFER_SIZE
、8192のになります。それは、Pythonのバグ、Linuxのバグ、またはID10tのバグですか?
stdout
コンソールであるか、ファイルにリダイレクトされるかに関係なく、ラインバッファリングを行いたいですか?
write()
がファイルハンドルを呼び出すと、出力はメモリにバッファリングされ、バッファがいっぱいになるまで蓄積されます...バッファが「フラッシュ」されます(コンテンツがバッファからファイルに書き込まれます)。flush()
ファイルハンドルでメソッドを呼び出すことにより、バッファを明示的にフラッシュできます。
flush()
メソッドを使用して、プログラムでバッファをファイルに強制的にフラッシュすることもできます。
with open('out.log', 'w+') as f:
f.write('output is ')
# some work
s = 'OK.'
f.write(s)
f.write('\n')
f.flush()
# some other work
f.write('done\n')
f.flush()
これは、出力ファイルをでテーリングするときに便利ですtail -f
。
Note: flush() does not necessarily write the file’s data to disk. Use flush() followed by os.fsync() to ensure this behavior.
Note: flush() does not necessarily write the file’s data to disk. Use flush() followed by os.fsync() to ensure this behavior.
flushing
意味することです。なぜそれが必要なのですか?それは何のため?なぜ私はそれを気にする必要がありますか?
これがpythonにも当てはまるかどうかはわかりませんが、実行しているオペレーティングシステムに依存すると思います。
たとえば、Linuxでは、ターミナルへの出力は改行でバッファーをフラッシュしますが、ファイルへの出力では、バッファーがいっぱいになった場合(デフォルト)にのみフラッシュします。これは、バッファをフラッシュする回数が少ないほうが効率的であり、出力がファイルの改行でフラッシュされない場合でも、ユーザーが気付かない可能性が高いためです。
必要に応じて、出力を自動フラッシュできる場合があります。
編集:私はあなたがこの方法でPythonで自動フラッシュすると思う(ここからベース)
#0 means there is no buffer, so all output
#will be auto-flushed
fsock = open('out.log', 'w', 0)
sys.stdout = fsock
#do whatever
fsock.close()
ioモジュールから読み取り専用のDEFAULT_BUFFER_SIZE属性を呼び出して、デフォルトのバッファーサイズを確認することもできます。
import io
print (io.DEFAULT_BUFFER_SIZE)
OPがどちらを好むかを選択する別のアプローチを次に示します。
以下のコードを__init__
他のコードの前に.pyファイルに含めると、出力されたメッセージprint
とエラーはAbletonのLog.txtではなく、ディスク上の別のファイルに記録されます。
import sys
path = "/Users/#username#"
errorLog = open(path + "/stderr.txt", "w", 1)
errorLog.write("---Starting Error Log---\n")
sys.stderr = errorLog
stdoutLog = open(path + "/stdout.txt", "w", 1)
stdoutLog.write("---Starting Standard Out Log---\n")
sys.stdout = stdoutLog
(Macの場合、変更 #username#
は、ユーザーフォルダーの名前にします。Windowsでは、ユーザーフォルダーへのパスの形式が異なります)
ディスク上のファイルが変更されたときに内容を更新するテキストエディターでファイルを開くと(Macの例:TextEditではなくTextWranglerでは変更されます)、ログがリアルタイムで更新されます。
クレジット:このコードは主にNathan RamellaによってliveAPIコントロールサーフェススクリプトからコピーされました