首页 > 解决方案 > 记录/打印语句在 Python Django 应用程序的子进程中不起作用

问题描述

在我的 Django 项目中,我有一个名为views.py. 那里有几个日志记录/打印语句,它们工作正常。

但是,views.py使用 subprocess 的run方法调用另一个 python 脚本。令人惊讶的是,该脚本中没有任何日志记录/打印语句。这就是run()被称为:

out= run([sys.executable, /path/to/script.py, param1, param2], shell=False, stdout=PIPE)

日志在 settings.py 中配置如下:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
        },
    },
    'loggers': {
        'my_logger': {
            'handlers': ['console'],
            'level': 'INFO',
        },
    },
}

请告知出了什么问题。

谢谢。

标签: pythonpython-3.xdjangoweblogging

解决方案


当您调用subprocess.runwith 时stdout=subprocess.PIPE,您必须自己显示来自调用脚本的标准流。以下是您应该如何捕获这些打印语句:

p = run(
    [sys.executable, /path/to/script.py, param1, param2],
    shell=False, stdout=PIPE, stderr=PIPE
)
# Display the contents of the standard output
print(p.stdout.read())
# Display the contents of the standard error
print(p.stderr.read())

请注意,p这里是CompletedProcess. 这意味着您可以使用它通过调用来检查您运行的命令是否成功p.returncode,其中应该包含运行的脚本的返回码。

如果您不希望自己捕获标准流并显示其内容,请考虑在设置stdoutandstderr的情况下调用脚本PIPE

p = run(
    [sys.executable, /path/to/script.py, param1, param2], shell=False
)

这应该强制在脚本运行时显示标准流 (stdout和)。stderr


推荐阅读