如何解决使用subprocess.Popen时,mongoexport的输出在stderr
我正在尝试将我的 MongoDB 集合导出到 JSON 文件中,根据 subprocess.Popen.communicate()
,我可以使用以下内容:
from time import time
from subprocess import Popen,PIPE,TimeoutExpired
filename = f"products - {int(time())}.json"
try:
process = Popen(
[
"mongoexport","--jsonArray","--pretty",f"--db=dbname","--collection=products",f"--out={filename}",],stdout=PIPE,stderr=PIPE
)
stdout,stderr = process.communicate(timeout=10)
print(str(stdout))
print()
print(str(stderr))
except TimeoutExpired:
error_message = (
"commands.py - export() - "
"timeout - killing process"
)
logging.error(error_message)
process.kill()
except Exception as e:
error_message = (
"commands.py - export() - "
f"Couldn't export - {e}"
)
logging.error(error_message)
程序成功运行并创建了文件,但是那些 stdout
和 stderr
变量不是我所期望的。这将打印到控制台:
b''
b'2021-05-23T12:02:12.119+0430\tconnected to: mongodb://localhost/\n2021-05-23T12:02:12.242+0430\texported 1761 records\n'
所以 stdout
为空,成功消息在 stderr
中。但是元组的顺序与我提供的链接中给出的示例相同:
proc = subprocess.Popen(...)
try:
outs,errs = proc.communicate(timeout=15)
except TimeoutExpired:
proc.kill()
outs,errs = proc.communicate()
怎么回事?
我之所以这么问是因为我想进一步检查 stderr
的输出,以确保一切都按计划进行。
解决方法
stderr 通常用于日志记录,stdout 用于程序输出。
因此,对于转储数据库的程序,转储本身可能会打印到标准输出,而信息性消息可能会打印到标准错误。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。