我编写了一个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脚本中完成原子文件的创建。
有什么建议吗?
答案 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。)