(1)についてはよくわかりません。
(2)については、Pythonが新しい行ごとにstdoutにフラッシュされると思います。しかし、stdoutをオーバーロードしてファイルにする場合、頻繁にフラッシュしますか?
ファイル操作の場合、Pythonは、特に設定しない限り、オペレーティングシステムのデフォルトのバッファリングを使用します。バッファサイズ、バッファなし、またはラインバッファを指定できます。
たとえば、関数openはバッファサイズの引数を取ります。
http://docs.python.org/library/functions.html#open
「オプションのバッファリング引数は、ファイルに必要なバッファサイズを指定します。」
コード:
bufsize = 0
f = open('file.txt', 'w', buffering=bufsize)
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
を使用して出力ファイルを作成するときに、これが役立つことがわかりました。
これがpythonにも当てはまるかどうかはわかりませんが、実行しているオペレーティングシステムによって異なると思います。
たとえば、Linuxでは、ターミナルへの出力は改行でバッファをフラッシュしますが、ファイルへの出力では、バッファがいっぱいになったときにのみフラッシュします(デフォルト)。これは、バッファーをフラッシュする回数が少ない方が効率的であり、ユーザーがファイル内の改行で出力がフラッシュされない場合に気付く可能性が低いためです。
必要な場合は、出力を自動フラッシュできる場合があります。
編集:pythonでこのように自動フラッシュすると思います( here に基づく)
#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コントロールサーフェススクリプトからコピーされました