问题描述
我正在尝试将我的 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 用于程序输出。
因此,对于转储数据库的程序,转储本身可能会打印到标准输出,而信息性消息可能会打印到标准错误。