在 python 中仅捕获 stdout 的输出
Capture the output of ONLY stdout in python
PYTHON 版本 - 3.5.2 OS - Ubuntu 16.04 LTS
我目前正在使用 stdout 和 print 语句写入终端。
我只想捕获 sys.stdout.write 命令的输出,而不是打印命令
例如,如果我的代码是 -
import sys
sys.stdout.write("Hello")
print("PRINT")
我只想捕获 "Hello" 而不是 "PRINT"。
我目前正在使用这个:
x = subprocess.run(['python3 test.py'] , shell = True , stdout = subprocess.PIPE).stdout.decode('utf-8')
这给了我这个输出:
['HelloPRINT', '']
您不能这样做,因为 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!
print()
使用 sys.stdout.write()
显示文本。
此外suproccess
只能看到系统发送的文本,它不知道你用什么向系统发送文本。
您只能在代码中将 print()
重定向到 sys.stderr
import sys
sys.stdout.write("Hello")
print("PRINT", file=sys.stderr)
然后当您在控制台中 运行 时,您仍然会看到所有文本,但当您使用 subprocess
时,您只会看到 sys.stdout
如果你在控制台中使用
,你也只会在文件中得到 stdout
python script.py > stdout.txt
或者您重定向到其他程序
python script.py | sort
您也可以使用 sys.stderr.write("PRINT\n")
而不是 print(... ,file=sys.stderr)
,但您必须在末尾手动添加 "\n"
。
您可以像这样定义自己的 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
PYTHON 版本 - 3.5.2 OS - Ubuntu 16.04 LTS
我目前正在使用 stdout 和 print 语句写入终端。 我只想捕获 sys.stdout.write 命令的输出,而不是打印命令 例如,如果我的代码是 -
import sys
sys.stdout.write("Hello")
print("PRINT")
我只想捕获 "Hello" 而不是 "PRINT"。
我目前正在使用这个:
x = subprocess.run(['python3 test.py'] , shell = True , stdout = subprocess.PIPE).stdout.decode('utf-8')
这给了我这个输出:
['HelloPRINT', '']
您不能这样做,因为 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!
print()
使用 sys.stdout.write()
显示文本。
此外suproccess
只能看到系统发送的文本,它不知道你用什么向系统发送文本。
您只能在代码中将 print()
重定向到 sys.stderr
import sys
sys.stdout.write("Hello")
print("PRINT", file=sys.stderr)
然后当您在控制台中 运行 时,您仍然会看到所有文本,但当您使用 subprocess
sys.stdout
如果你在控制台中使用
,你也只会在文件中得到stdout
python script.py > stdout.txt
或者您重定向到其他程序
python script.py | sort
您也可以使用 sys.stderr.write("PRINT\n")
而不是 print(... ,file=sys.stderr)
,但您必须在末尾手动添加 "\n"
。
您可以像这样定义自己的 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