我想读取由
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
你能告诉我什么是确保计划在尝试读取之前已写入磁盘的最佳方法,而不是增加巨大的时间延迟吗?提前致谢。
无需调用
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,表示成功)则中止。cat
在 Python 中读取文件。shell=False
,当cmd是列表或元组时,这是默认值。仅供参考由于内核缓冲区和缓存,数据可能会在几秒钟后刷新到永久存储(例如 HDD 或 SSD 上的文件系统)。但是,您不必在程序中等待它,因为内核将确保(刷新的)文件写入后的任何后续读取都将看到写入的输出,即使输出仅在缓冲区或缓存中.