【发布时间】:2018-11-19 00:51:24
【问题描述】:
我想运行一个程序,等待它的输出,向它发送输入并重复直到出现条件。
我能找到的只是关于等待程序完成的问题,事实并非如此。该过程仍将运行,只是不会提供任何(新)输出。
程序输出在标准输出和日志文件中,都可以使用。
使用 linux。
到目前为止的代码:
import subprocess
flag = True
vsim = subprocess.popen(['./run_vsim'],
stdin=subprocess.pipe,
shell=true,
cwd='path/to/program')
while flag:
with open(log_file), 'r') as f:
for l in f:
if condition:
break
vsim.stdin.write(b'do something\n')
vsim.stdin.flush()
vsim.stdin.write(b'do something else\n')
vsim.stdin.flush()
事实上,即使在程序完成启动之前,“做某事”输入也会被多次发送。此外,在程序完成运行最后一次 while 迭代的命令之前读取日志文件。这会导致它缓冲输入,因此即使在满足条件后我也会继续执行命令。
我可以在每个stdin.write 之后使用time.sleep,但由于执行每个命令所需的时间是可变的,我需要使用比必要时间更长的时间,从而使 python 脚本变慢。此外,这是一个愚蠢的解决方案。
谢谢!
【问题讨论】:
-
子进程是否打印某种标准的“完成”消息,表明它已完成处理?如果是这样,您可能可以使用
pexpect。 -
进程是将数据转储到管道还是将其运球 - 当您获得数据时,您如何知道您已获得所有数据?你是说进程永远不会终止吗?
-
@Linuxios 我不知道,但我会调查一下。
-
@wwii 我没有,但我会阅读文档。我很确定它是多线程的,如果不是,python 脚本会等待子进程运行(我可能是错的,以前从未使用过线程)
标签: python python-3.x subprocess