从TCL调用python脚本并以原子方式创建文件

时间:2017-08-08 17:10:27

标签: python file tcl atomic

我编写了一个python脚本,负责按照other question中的描述原子地创建文件。脚本创建的文件有点大(约1.5MB),如下所示:

$ ./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在内部缓冲输出,因此使用puts编写的字符可能不会   立即出现在输出文件或设备上; Tcl通常会   延迟输出直到缓冲区已满或通道关闭。

我相信这解释了为什么我的文件不再以原子方式创建。我不是TCL的专家,所以我不确定如何在TCL脚本中完成原子文件的创建。

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

我认为您想要的只是flush stdout

答案 1 :(得分:0)

您链接到的Python代码的直接翻译将是这样的(未经测试的代码):

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

获取sync命令需要TclX包。 (这可能不适用于Windows。)