如何确保文件在读取之前已写入磁盘

问题描述 投票:0回答:1

我想读取由

fast-downward
规划器生成的 plan.txt 文件,为此我使用
subprocess
如下:

import subprocess

search_options = "lama-first"
## Call Planner
cmd = [
    "python3",
    self.planner_path,
    "--alias",
    search_options,
    "--plan-file",
    self.plan_path,
    self.domain_path,
    self.problem_path,
]
## Read plan.txt
cmd2 = ["cat", self.plan_path]
subprocess.run(cmd, shell=False, stdout=subprocess.PIPE)

plan = []
try:
    # Huge dealy to be sure that the plan is written to the txt file
    time.sleep(1)
    result2 = subprocess.run(cmd2, shell=False, stdout=subprocess.PIPE)
    plan = result2.stdout.decode("utf-8")
except:
    pass

你能告诉我什么是确保计划在尝试读取之前已写入磁盘的最佳方法,而不是增加巨大的时间延迟吗?提前致谢。

python subprocess read-write
1个回答
1
投票

无需调用

time.sleep(...)
,因为(1)
subprocess.run
等待子进程退出; (2) libc 和内核一起确保在(子)进程退出时将所有未决数据刷新到输出文件。

修改后的代码如下所示:

import os
import subprocess

try:
    # Remove output of previous invocation.
    os.remove(self.plan_path)
except OSError:
    pass
search_options = "lama-first"
cmd = [
    "python3",
    self.planner_path,
    "--alias",
    search_options,
    "--plan-file",
    self.plan_path,
    self.domain_path,
    self.problem_path,
]
subprocess.run(cmd).check_returncode()
with open(self.plan_path) as f:
    plan = f.read().decode("utf-8")

题中代码的一些评论:

  • subprocess.run(...)
    之后,调用
    .check_returncode()
    ,如果子进程没有成功退出(退出代码为0,表示成功)则中止。
  • 除了:pass,别用。它隐藏了所有异常,因此您不会收到有关相关错误的通知。
  • 为了简单性和可移植性(例如到 Windows),使用 open(...) + read() 而不是
    cat
    在 Python 中读取文件。
  • 无需指定
    shell=False
    ,当cmd是列表或元组时,这是默认值。

仅供参考由于内核缓冲区和缓存,数据可能会在几秒钟后刷新到永久存储(例如 HDD 或 SSD 上的文件系统)。但是,您不必在程序中等待它,因为内核将确保(刷新的)文件写入后的任何后续读取都将看到写入的输出,即使输出仅在缓冲区或缓存中.

© www.soinside.com 2019 - 2024. All rights reserved.