python - 记录/打印语句在 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',
},
},
}
请告知出了什么问题。
谢谢。
解决方案
当您调用subprocess.run
with 时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
,其中应该包含运行的脚本的返回码。
如果您不希望自己捕获标准流并显示其内容,请考虑在不设置stdout
andstderr
的情况下调用脚本PIPE
:
p = run(
[sys.executable, /path/to/script.py, param1, param2], shell=False
)
这应该强制在脚本运行时显示标准流 (stdout
和)。stderr
推荐阅读
- python - 使用 keras 预测二项式函数
- django-rest-framework - 如何制作不同的 Django Api Url 路径
- r-markdown - 手动创建表格并自动对其标题进行编号,单词输出
- php - Laravel - 在 Jobs 中使用图像干预。图像ttfbbox错误
- r - readr::type_convert 弄乱了时间列
- linux - 带有 Qt 5.12 QSocketNotifier 的 ZeroMQ 只触发一次
- c# - 尽管用户具有正确的角色,但在控制器方法上使用 Authorize 注释仍显示“访问被拒绝”
- java - 使用 1.HttpURLConnection.setRequestProperty 和 2. 使用 CURL 将 b/w http 标头值设置为 null 有什么区别?
- mongodb - mongodb找到key过大的文档
- gulp - 如何调整我的 gulp 静态资产修订以与 ServiceWorkers 一起使用?