Python - 运行进程并等待输出

时间:2018-06-08 23:14:09

标签: python python-3.x subprocess

我想运行一个程序,等待它的输出,向它发送输入并重复直到某个条件。

我所能找到的只是等待程序完成的问题,事实并非如此。这个过程仍然在运行,它只是不会给出任何(新的)输出。

程序输出在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脚本更慢。此外,这是一个愚蠢的解决方案。

谢谢!

3 个答案:

答案 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 Demo


来自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)