我想运行一个程序,等待它的输出,向它发送输入并重复直到某个条件。
我所能找到的只是等待程序完成的问题,事实并非如此。这个过程仍然在运行,它只是不会给出任何(新的)输出。
程序输出在stdout中,在日志文件中,可以使用 使用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()
按原样,"做某事"即使在程序完成启动之前,也会多次发送输入。此外,在程序从上次迭代运行完成命令之前读取日志文件。这导致它缓冲输入,所以即使满足条件后我也会继续执行命令。
我可以在每个time.sleep
之后使用stdin.write
,但由于执行每个命令所需的时间是可变的,我需要使用比所需时间更长的时间使python脚本更慢。此外,这是一个愚蠢的解决方案。
谢谢!
答案 0 :(得分:0)
如果您使用的是python3,则可以尝试更新代码以使用subprocess.run
代替。它应该等待您的任务完成并返回输出。
答案 1 :(得分:0)
从2019年开始,您可以使用subprocess.getstatusoutput()运行一个进程并等待输出,即:
import subprocess
args = "echo 'Sleep for 5 seconds' && sleep 5"
status_output = subprocess.getstatusoutput(args)
if status_output[0] == 0: # exitcode 0 means NO error
print("Ok:", status_output[1])
else:
print("Error:", status_output[1])
来自python docs:
subprocess.getstatusoutput(_cmd_)
返回(exitcode, output)
,在外壳中执行 cmd 。
在带有Popen.check_output()
的shell中执行字符串 cmd ,并返回2元组(exitcode, output)
。使用语言环境编码;有关更多详细信息,请参见Frequently Used Arguments上的注释。
从输出中删除尾随换行符。该命令的退出代码可以解释为子流程的返回代码。示例:
>>> subprocess.getstatusoutput('ls /bin/ls')
(0, '/bin/ls')
>>> subprocess.getstatusoutput('cat /bin/junk')
(1, 'cat: /bin/junk: No such file or directory')
>>> subprocess.getstatusoutput('/bin/junk')
(127, 'sh: /bin/junk: not found')
>>> subprocess.getstatusoutput('/bin/kill $$')
(-15, '')
答案 2 :(得分:-1)
您可以使用命令而不是子进程。以下是ls命令的示例:
import commands
status_output = commands.getstatusoutput('ls ./')
print status_output[0] #this will print the return code (0 if everything is fine)
print status_output[1] #this will print the output (list the content of the current directory)