微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用subprocess.Popen时,mongoexport的输出在stderr

如何解决使用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)

程序成功运行并创建了文件,但是那些 stdoutstderr 变量不是我所期望的。这将打印到控制台:

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 举报,一经查实,本站将立刻删除。