python实时管道subprocess.check_输出还是解决办法?

2024-05-15 03:25:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我在一个大型项目中包括一个部分,在python中,如下所示:

failcount = 0
done = False
while done == False:
    try:
        result = subprocess.check_output(program)
        done = True
    except subprocess.CalledProcessError as e:
        failcount += 1
        logwrite('logfile.txt', 'Failed. Counter = {0}\nError message: {1}\n-'.format(failcount, e.returncode))
        if failcount == 20:
            print 'It failed 20 times, aborting...'
            quit()

这意味着从命令行运行“program”“程序”是一个大型的计算化学包,有时会失败,所以我在这里循环运行它。如果失败20次,那么python脚本将终止。这样做很好,而且能达到预期的效果。然而,我的问题是,我的化学程序包每次尝试大约需要三个小时,我想在它进行的过程中监控它。在

如果我从命令行手动运行它,我可以简单地执行“program>;logfile”,然后跟踪日志文件以观察它的运行情况。但是,在python中似乎不能执行以下操作:

^{pr2}$

有没有办法让python打印出输出检查子进程当它被填满的时候?我想输出检查子进程只包含stdout中的任何内容。我能在python和管道之间克隆它吗?在

可能的解决方法:我编写了一个名为run的bash脚本_程序.sh它只执行上面列出的program>;logfile,然后使用python的子进程执行run_程序.sh。这样我就可以监控了,但是现在程序的输出是在一个文件中,而不是在python中,所以我必须让python读取一个大的日志文件,如果需要,还可以捕获错误消息,所以我更希望能避免类似的情况。在


Tags: 文件run命令行gt程序脚本false进程
1条回答
网友
1楼 · 发布于 2024-05-15 03:25:22

可以使用subprocess.check_output,而不是使用^{}。此对象表示您的子进程,并具有可以读取的stdout和stderr属性。如果您的子进程只使用stdout,您可能只需在循环中调用Popen.stdout.readline()。但是,如果子进程写入其他管道,则可能会遇到死锁(有关详细信息,请参阅文档)。在这种情况下,我建议使用http://stefaanlippens.net/python-asynchronous-subprocess-pipe-reading/中描述的consume函数,它可以安全地让您在子进程输出时逐行打印stdout和stderr。在

或者,如果您将shell=True传递给check_output函数,那么使用subprocess.check_output(['program', '>', 'logfile'])的方法应该有效。>是一个shell指令,如果将其作为独立命令运行,则无法识别该指令。在

编辑:上面的代码不会返回任何输出供Python程序使用。相反,subprocess.check_output('program | tee logfile', shell=True)。在

如果使用shell=True,请注意您完全控制check_output的参数。为了安全起见,绝不允许任何用户或网络输入传递到shell。请参阅this warning了解原因。在

相关问题 更多 >

    热门问题