2017-08-08 18 views
0

私は、other questionで説明したようにファイルをアトミックに作成するためのpythonスクリプトを作成しました。下図のようにスクリプトによって作成されるファイルは(約〜1.5メガバイト)やや大きいです:TCLからpythonスクリプトを呼び出して、アトミックにファイルを作成する

$ ./my_script.py --output_file some_directory/my_file.txt 
$ ls -l --block-size=K some_directory/my_file.txt 
-rw------- 1 foouser foogroup 1477K Aug 7 17:39 some_directory/my_file.txt 

残念ながら、一部のレガシーインフラと物事が設定されている方法に、このスクリプトから呼び出される必要がありますTCLスクリプト内。私は、生成されたファイルは、(アトミックは、自分のアプリケーションのための要件である)もうアトミックに作成されていないようだということで見てい

#!/usr/bin/env tclsh 
set PY_SCRIPT my_script.py 
puts [exec $PY_SCRIPT --output some_directory/my_file.txt] 

問題:ここで私は現在、それをやっている方法です。 TCL puts command documentationは、次の言葉:プットで書かれた文字が が出力ファイルまたはデバイス上ですぐに表示されない場合がありますので、

Tclは、内部的に出力をバッファリングします。バッファがいっぱいになるかチャンネルが閉じられるまで、Tclは通常 遅延出力を行います。

これは、私のファイルがそれ以上アトミックに作成されない理由を説明していると思います。私はTCLの専門家ではないので、TCLスクリプトでアトミックファイルを作成する方法がわかりません。

提案がありますか?

package require Tclx 

set f [open $tmpFile w] 
puts -nonewline $f $text 
sync $f ; # flush is performed implicitly 
close $f 

file rename -force $tmpFile $myFile 

TCLXパッケージはsyncコマンドを取得するために必要とされている:あなたがにリンク

+0

なぜ 'puts'が必要なのでしょうか?あなたはまだmy_script.pyを使って必要な出力をすべて生成していますね。あなたはtclでそのスクリプトを実行するべきではありませんか? –

+0

サイズが通常はアトミックに書かれていないファイルがありますか?実際の原子書込みの通常のサイズは約16kBですが、OSは原子性をシミュレートするビューを提供する可能性があります。ウィルス対策ソフトウェア(書き込みのアトミック性を損なうことが多い)の影響により、Windowsではすべてが目立つようになります。 –

+0

@DonalFellows彼らのリンクされた質問に基づいて、OPは原子書き込みの概念を誤って使用しているように見えるだけです。 –

答えて

0

Pythonコードの直接の翻訳は、この(未テストコード)のようなものになるだろう。 (これはおそらくWindowsでは動作しません)

関連する問題