我在一个大型项目中包括一个部分,在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读取一个大的日志文件,如果需要,还可以捕获错误消息,所以我更希望能避免类似的情况。在
可以使用} 。此对象表示您的子进程,并具有可以读取的stdout和stderr属性。如果您的子进程只使用stdout,您可能只需在循环中调用
subprocess.check_output
,而不是使用^{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了解原因。在相关问题 更多 >
编程相关推荐