Py学习  »  Python

在python中只捕获stdout的输出

Tanmay Bhatnagar • 6 年前 • 1635 次点击  

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', '']
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/43958
文章 [ 3 ]  |  最新文章 6 年前
David Cullen
Reply   •   1 楼
David Cullen    6 年前

您可以定义自己的版本 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
MaxiMouse
Reply   •   2 楼
MaxiMouse    6 年前

你不能这样做是因为 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!
furas
Reply   •   3 楼
furas    6 年前

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" 最后手动。