You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 14:22:57