15

我正在使用 Heroku 在 Python 中开发一个 Web 应用程序,但我不知道如何有效地测试调试它。我尝试使用 print(...) 和 sys.stdout.write(...) 但是当我使用“foreman start”在本地运行或部署到云并运行“heroku logs”来查看时,我从未看到任何输出云日志。此外,我不知道如何调试 python 运行时错误,例如发生异常时。该应用程序的 Web 请求返回 HTTP 500,但我无法调试它以查看异常的来源。有什么办法可以看到这些信息吗?

4

3 回答 3

17

添加sys.stdout.flush()打印语句后为我解决了这个问题。

就我而言,问题似乎是 stdout 被缓冲而 stderr 没有。

如果您甚至没有通过 看到异常foreman start,请确保您实际上是在正确的 IP/PORT 上访问您的服务器。您应该会在来自foreman start.

此外,您可以尝试让您的 Web 框架在调试模式下运行——大多数现代框架将在调试/开发模式下在浏览器中显示堆栈跟踪。使用烧瓶?app.config['DEBUG'] = Trueapp.run(..., debug=True)

# logging helper
def p(*args):
  print args[0] % (len(args) > 1 and args[1:] or [])
  sys.stdout.flush()
于 2012-10-13T21:51:57.547 回答
15

如果您正在使用 Foreman 运行 Python 项目,并且在查看 stdout/stderr 时遇到问题,这里有一些适合您的解决方案。如果您使用 Procfile 直接调用 python CLI,那么您可以使用“-u”选项来避免标准输出缓冲:

python -u script.py

如果你使用 Procfile 来管理一个 WSGI 服务器,例如调用 gunicorn、flask、bottle、eve 等,那么你可以在你的 python 项目的根目录中添加一个“.env”文件,包含以下内容:

PYTHONUNBUFFERED=True

另请参阅此问题的答案: 工头仅显示带有“started wit pid #”的行,没有其他内容

于 2014-01-28T04:33:19.357 回答
9

请注意任何其他 Django/Python 初学者。记得添加

import sys

和这样的东西

print ("hello world") # python 3
sys.stdout.flush()

将打印到控制台。

从 PHP 迁移到 Py/Dj KISS 可能很少见。

于 2013-09-01T17:26:34.527 回答