我正在使用 Heroku 在 Python 中开发一个 Web 应用程序,但我不知道如何有效地测试调试它。我尝试使用 print(...) 和 sys.stdout.write(...) 但是当我使用“foreman start”在本地运行或部署到云并运行“heroku logs”来查看时,我从未看到任何输出云日志。此外,我不知道如何调试 python 运行时错误,例如发生异常时。该应用程序的 Web 请求返回 HTTP 500,但我无法调试它以查看异常的来源。有什么办法可以看到这些信息吗?
3 回答
添加sys.stdout.flush()
打印语句后为我解决了这个问题。
就我而言,问题似乎是 stdout 被缓冲而 stderr 没有。
如果您甚至没有通过 看到异常foreman start
,请确保您实际上是在正确的 IP/PORT 上访问您的服务器。您应该会在来自foreman start
.
此外,您可以尝试让您的 Web 框架在调试模式下运行——大多数现代框架将在调试/开发模式下在浏览器中显示堆栈跟踪。使用烧瓶?app.config['DEBUG'] = True
或app.run(..., debug=True)
。
# logging helper
def p(*args):
print args[0] % (len(args) > 1 and args[1:] or [])
sys.stdout.flush()
如果您正在使用 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 #”的行,没有其他内容
请注意任何其他 Django/Python 初学者。记得添加
import sys
和这样的东西
print ("hello world") # python 3
sys.stdout.flush()
将打印到控制台。
从 PHP 迁移到 Py/Dj KISS 可能很少见。