代码之家  ›  专栏  ›  技术社区  ›  kmiklas

为什么Python 3换行符\n不能与print和subprocess Popen stdout一起使用?

  •  2
  • kmiklas  · 技术社区  · 7 年前

    Python 3.7.1:调用 grep

    例子

    a = subprocess.Popen(["grep", "ERR", "errors.log"], stdout=subprocess.PIPE)
    print(a.stdout.read())
    

    ERR 1 ret: 31113\nERR 2 ret: 35523\nERR 3 ret: 3810 (etc.)
    

    ERR 1 ret: 31113
    ERR 2 ret: 35523
    ERR 3 ret: 3810
    (etc.)
    

    我一直在搜索答案,但运气不好。泰铢:^)

    How would I specify a new line in Python?
    Python Popen grep

    2 回复  |  直到 7 年前
        1
  •  2
  •   Jean-François Fabre    7 年前

    Popen 标准输出和错误是 按默认值。打印字节并不尝试打印换行符,而是打印它们的表示形式。

    在3.5之前,您不能使用 encoding ,但您当然可以使用 bytes.decode :

    a = subprocess.Popen(["grep", "ERR", "errors.log"], stdout=subprocess.PIPE)
    print(a.stdout.read().decode())
    

    ( decode 可能需要一个参数(取决于文件的内容)

        2
  •  1
  •   wim    7 年前

    指定用于解码子进程输出的编码。我不能告诉你你的 errors.log 文件编码为,但请尝试使用“utf-8”:

    a = Popen(["grep", "ERR", "errors.log"], stdout=subprocess.PIPE, encoding='utf-8')