我想使用外部庫并重定向它們的輸出,但該庫使用如下所示的函式msg。
我測驗了其他一些標準輸出方法(它們都在下面的最小示例中)并且它們都被重定向。我也嘗試使用contextmanager沒有成功。
此外,如果msg方法接受file引數 with sys.stdout,則輸出將被重定向。
import sys
from contextlib import redirect_stdout
from io import StringIO
from contextlib import contextmanager
def msg(msg, file=sys.stdout):
file.write(msg)
def msg2(msg):
sys.stdout.write(msg)
def print_method(msg):
print(msg)
stream = StringIO()
write_to_stream = redirect_stdout(stream)
with write_to_stream:
print("print")
msg("method\n")
msg2("method 2\n")
print_method("print method")
sys.stdout.write("write\n")
print("\nCaught data:")
print(stream.getvalue())
示例的輸出是:
method
Caught data:
print
method not default
method 2
print method
write
但我想method在Caught data:下劃線。
msg是否也可以選擇使用file默認引數重定向方法?
uj5u.com熱心網友回復:
要強制將所有輸出重定向到標準輸出到檔案物件,您可以sys.stdout直接使用所需的檔案物件覆寫:
sys.stdout = stream
但是,要使覆寫成為臨時的,您可以將unittest.mock.patch其用作背景關系管理器:
import sys
from io import StringIO
from unittest.mock import patch
stream = StringIO()
with patch('sys.stdout', stream):
print('foo')
sys.stdout.write('bar')
print('Captured output:', stream.getvalue(), sep='\n')
這輸出:
Captured output:
foo
bar
演示:https ://replit.com/@blhsing/JealousKnownScience
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/516786.html
下一篇:使用htaccess縮短url
