文件刷新并与其他程序同步

时间:2014-12-15 18:14:46

标签: windows python-2.7 batch-file

我正在运行一个Python脚本,用于在Windows 7上启动.bat文件。批处理文件运行一种蒙特卡罗程序2分钟。在这2分钟结束时,程序必须更新我将在同一Python脚本中读取的数据文件,对输出进行一些数据分析,并在必要时重新启动相同的.bat文件。

我在无限量的时间内完成此过程,直到获得满意的输出。

Python代码看起来像这样

import os
import numpy as np
os.system('myBatch.bat > messages.txt')

while True:
    # force flushing
    fd = open("output.txt",'a')  
    fd.flush()
    os.fsync(fd.fileno())
    fd.close()

    # read data
    data = np.loadtxt("output.txt")

    # some data analysis ...

    # testing
    if dataSatisfactory:
        break
    else:
        os.system('myBatch.bat > messages.txt')

正如您所看到的,我正试图强制刷新必须由批处理文件中的程序写入的 output.txt 文件。因为我无法控制这个已编译的可执行程序,所以在命令os.system('myBatch.bat > messages.txt')之后输出文件没有得到更新,但只有在我终止整个python进程之后才会更新。

我尝试在#force flushing之后添加4行,但显然仍无效。

为了澄清,可执行文件的输入是 output.txt 以及输出,因此可执行文件必须覆盖文件 output.txt

文件 messages.txt 是将可执行文件的所有邮件从stdout重定向到 messages.txt

有任何建议或暗示吗?

注意:批处理文件看起来像这样

.\TheExecutable %output.txt

1 个答案:

答案 0 :(得分:0)

  1. 如果您的批处理文件除了调用您的monte carlo程序之外什么都不做,请将其删除并直接从python调用该程序:os.system("TheExecutable.exe output.txt")
  2. 如果您可以将程序写入标准输出而不是文件,则可以使用subprocess.check_output("TheExecutable.exe")来返回该标准输出。有关从字符串而不是文件名加载的函数,请参阅the documentation of numpy.loadtxt()。 这样,你完全避免写作&读取/从磁盘读取。