【问题标题】:How to flush STDOUT in python CGI file hosted on PCF?如何在 PCF 上托管的 python CGI 文件中刷新 STDOUT?
【发布时间】:2019-12-13 08:31:12
【问题描述】:

由于 Apache 网关超时,并且希望向最终用户显示更多信息,我希望能够在 PCF 上托管的 python CGI 脚本上刷新 STDOUT,本质上是提供脚本状态的更新。

我尝试在 python 中启用 -u 标签(#!/usr/python -u 在我的脚本开头)、sys.stdout.flush() 命令,甚至使用 subprocess.call 来执行 perl 脚本设置为刷新到打印一些进度文本的 STDOUT ($| = 1; 在 perl 脚本的开头)。此外,我仔细检查了我没有使用任何需要缓冲的 Apache 模块(例如,没有 mod_deflate)。最后,我会提到执行标准 perl CGI 而不是 python CGI 允许 STDOUT 刷新,所以我认为它必须与我的 python/Apache/PCF 配置有关。

我对这里的想法很新鲜,想要一些建议。

使用上述任何一种方法,我都认为标准输出会刷新。但是,它们都没有奏效!

提前感谢您的帮助。

【问题讨论】:

  • 你试过print("foo", flush=True)吗?
  • 对不起,忘记在帖子中提到我使用的是python 2.7.x(我记得在标签中)

标签: python python-2.7 apache cgi cloud-foundry


【解决方案1】:

您可以在 Python2 代码中使用类似的内容禁用缓冲:

    # set stdout as non-buffered
    if hasattr(sys.stdout, 'fileno'):
         fileno = sys.stdout.fileno()
         tmp_fd = os.dup(fileno)
         sys.stdout.close()
         os.dup2(tmp_fd, fileno)
         os.close(tmp_fd)
         sys.stdout = os.fdopen(fileno, "w", 0)

这是在没有缓冲区的情况下重新打开 sys.stdout(即 0 作为第三个参数)。完成此操作后,写入sys.stdout 的任何内容都不应被缓冲。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-11
    • 1970-01-01
    • 2021-04-22
    • 1970-01-01
    相关资源
    最近更新 更多