【问题标题】:Is there buffering?有缓冲吗?
【发布时间】:2015-12-16 17:22:01
【问题描述】:

我正在尝试在 Raspberry Pi 上的 Apache 上编写 Python 脚本。我的脚本包含:

#!/usr/bin/env python3
print("Content-type: text/html\n\n")
print("<!DOCTYPE html>\n<head>")

# ... other code

try:
    with picamera.PiCamera() as camera:
       camera.capture('camera.jpg')
except Exception as error:
    errorMsg = error

PiCamera 代码产生了错误(因为我正在将一些现有代码迁移到新的 Pi 并且尚未移动相机)。错误被捕获,但 Apache 仍然产生 500 错误。错误日志显示:

malformed header from script 'start.py': Bad header: * failed to open vchiq instanc

似乎 PiCamera 错误输出已通过管道传输到 Http 输出。这不是很好吗,因为我的第一个打印功能已经输出了两个空行?错误消息是否意味着 PiCamera 输出被解释为 Http 标头?如果有,为什么?

【问题讨论】:

  • 如果在打印语句之后删除所有代码会怎样?
  • try块没有写出错误消息时脚本工作正常,即即使try块导致except块被执行,网页也按预期生成. “* failed to open vchiq instanc”是来自camera.capture 行的错误消息,因为正在运行的进程不在组video 中。当我将 www-data 添加到组视频时,不再出现 500 错误,即使由于我在 Pi 上没有摄像头而运行了 except 块,即 camera.capture 失败并被成功捕获。
  • 如果您将任何内容打印到 stderr:print('error', file=sys.stderr),它是否会产生 500 http 错误?如果是,那么redirect sys.stderr.
  • 奇怪,我添加了print('error',file=sys.stderr),但没有 500 错误。虽然我已经解决了我的问题,但我仍然很困惑。

标签: python apache python-3.x raspberry-pi


【解决方案1】:

一些网络服务器(即 Apache)会缓冲脚本输出,直到脚本结束。正如我所见,sys.stdout.flush() 没有帮助。

您可以在单独的脚本中取出不可打印的代码并将其称为subprocess.call(['2nd script'], stdout = subprocess.PIPE, stderr = subprocess.PIPE)(或subprocess.DEVNULL

【讨论】:

  • (1) 您不需要将代码移动到单独的进程中。捕获异常就足够了(2)不要使用subprocess.call()PIPE,它可能会挂起子进程,即使用DEVNULL丢弃输出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-03
  • 1970-01-01
  • 1970-01-01
  • 2021-02-16
  • 1970-01-01
  • 1970-01-01
  • 2014-06-23
相关资源
最近更新 更多