Azure Runbooks中使用while循环时,未指定flush=True的print函数无法输出的问题
Azure Runbooks中使用while循环时,未指定flush=True的print函数无法输出的问题
兄弟我太懂你这种血压飙升的感觉了——明明代码逻辑没问题,就是输出死活不出来,换谁都得火大!我来帮你捋清楚这事儿:
问题根源
Azure Runbooks的Python运行环境对长时间运行的脚本(比如你的无限while循环)有特殊的输出缓冲机制:默认情况下,print的内容会先存在内存缓冲区里,不会立刻显示到Runbooks的输出面板,只有当缓冲区被填满,或者脚本执行结束时,才会一次性把内容吐出来。
而你去掉while循环后,脚本很快就跑完了,缓冲区会自动刷新,所以所有print内容都能正常显示。更坑的是,哪怕是循环外的print,因为脚本进入无限循环后永远不会结束,缓冲区一直没机会刷新,那些内容也被死死卡在里面了。
快速解决办法
有两种方式能搞定这个输出问题:
- 逐个给print加参数:给所有
print语句都加上flush=True,强制实时刷新输出缓冲区,就像你在print("Entering loop.....",flush=True)这里做的一样。比如把认证相关的print改成:
这样每一条print("Authenticating Service Principal....", flush=True) print("Service Principal Authenticity Verified", flush=True)print的内容都会立刻显示出来。 - 全局关闭缓冲:如果你不想一个个加参数,就在脚本最开头加上这段代码,强制让标准输出实时刷新:
之后所有的import sys sys.stdout = open(sys.stdout.fileno(), 'w', buffering=1)print都会自动生效,不用再额外加flush=True。
顺便给你提个代码逻辑小bug
我瞅了一眼你的代码,发现previous_vm_status = None是放在while True循环里面的——这意味着每次循环都会把之前的状态重置为None,这样current_vm_status != previous_vm_status永远都是True,根本检测不到状态持续不变的情况!
你得把这行移到循环外面,顺便还能把认证逻辑也移出去(没必要每次循环都重新认证),优化后的main函数大概是这样:
def main(): print("Entering loop.....",flush=True) # 只认证一次,避免重复调用API compute_client = service_principal_authentication() # 先获取初始状态 previous_vm_status = get_vm_status(compute_client) while True: current_vm_status = get_vm_status(compute_client) if current_vm_status != previous_vm_status: incident_number = generate_incident_reference_number() print(f"This has changed {current_vm_status} - {previous_vm_status} - {incident_number}", flush=True) # 这里可以补上发送邮件的逻辑 send_notification(f"VM Status Changed: {incident_number}", f"VM {vm_name} status changed from {previous_vm_status} to {current_vm_status}") else: print(f"This has remained the same {current_vm_status}", flush=True) previous_vm_status = current_vm_status time.sleep(10)
备注:内容来源于stack exchange,提问作者TheFlyingPrussian
相关产品推荐
相关产品推荐

