代码之家  ›  专栏  ›  技术社区  ›  Tanmay Bhatnagar

在python中只捕获stdout的输出

  •  0
  • Tanmay Bhatnagar  · 技术社区  · 5 年前

    python版本-3.5.2 操作系统-ubuntu 16.04 LTS

    我目前正在使用stdout和print语句向终端写入数据。 我只想捕获sys.stdout.write命令的输出,而不是print命令的输出 如果我的代码是-

    import sys
    sys.stdout.write("Hello")
    print("PRINT")
    

    我只想拍“你好”而不是“打印”。

    我目前正在使用:

    x = subprocess.run(['python3 test.py'] , shell = True , stdout = subprocess.PIPE).stdout.decode('utf-8')
    

    这给了我这个输出:

    ['HelloPRINT', '']
    
    1 回复  |  直到 5 年前
        1
  •  2
  •   furas    5 年前

    print() 使用 sys.stdout.write() 显示文本。

    此外 suproccess 只看到系统发送的文本,它不知道您以前向系统发送文本的方式。

    只能在代码重定向中 打印() sys.stderr

    import sys
    sys.stdout.write("Hello")
    print("PRINT", file=sys.stderr)
    

    当你在控制台中运行时,你仍然会看到所有的文本,但是你只会得到 sys.stdout 当你使用 subprocess

    你也只能得到 stdout 如果在控制台中使用

    python script.py > stdout.txt
    

    或者重定向到其他程序

    python script.py | sort
    

    而不是 print(... ,file=sys.stderr) 你也可以使用 sys.stderr.write("PRINT\n") 但你得加上 "\n" 最后手动。

        2
  •  1
  •   Maximouse Bhart ameta    5 年前

    你不能这样做是因为 print() 使用 sys.stdout.write() 内部。以下REPL会话说明了这一点:

    >>> import sys
    >>> class StdoutProxy:
    ...  def write(self, text):
    ...   return len(text) # do nothing
    ...
    >>> sys.stdout = StdoutProxy()
    >>> print("Hello!")
    >>> sys.stdout = sys.__stdout__  # reset stdout to its original state
    >>> print("Hello!")
    Hello!
    
        3
  •  1
  •   David Cullen    5 年前

    您可以定义自己的版本 print 功能如下:

    import sys
    
    def get_my_print(file=sys.stdout):
        _original_print = print
        def my_print(*objects, sep='', end='\n', file=file, flush=False):
            _original_print(*objects, sep='', end='\n', file=file, flush=False)
        return my_print
    
    original_print = print
    print("Redirect print to stderr...")
    print = get_my_print(sys.stderr)
    
    print("Print some numbers...")
    for x in range(10):
        print(x)
    
    print = original_print
    print("Done.")
    

    慰问

    $ python3 redirect_print.py 1> /dev/null
    Print some numbers...
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9