Saya menggunakan pustaka Python yang melakukan sesuatu pada suatu objek
do_something(my_object)
dan mengubahnya. Saat melakukannya, ia mencetak beberapa statistik ke stdout, dan saya ingin memahami informasi ini. Solusi yang tepat adalah mengubah do_something()
untuk mengembalikan informasi yang relevan,
out = do_something(my_object)
tetapi akan memakan waktu lama sebelum developer membahas do_something()
masalah ini. Sebagai solusinya, saya berpikir untuk mengurai apa pun yang do_something()
ditulis ke stdout.
Bagaimana cara menangkap output stdout antara dua titik dalam kode, misalnya,
start_capturing()
do_something(my_object)
out = end_capturing()
?
Jawaban:
Coba pengelola konteks ini:
Pemakaian:
output
sekarang menjadi daftar yang berisi garis-garis yang dicetak oleh pemanggilan fungsi.Penggunaan lanjutan:
Apa yang mungkin tidak jelas adalah bahwa ini dapat dilakukan lebih dari sekali dan hasilnya digabungkan:
Keluaran:
Pembaruan : Mereka ditambahkan
redirect_stdout()
kecontextlib
dalam Python 3.4 (bersama denganredirect_stderr()
). Jadi Anda bisa menggunakannyaio.StringIO
untuk mencapai hasil yang serupa (meskipunCapturing
menjadi daftar serta pengelola konteks bisa dibilang lebih nyaman).sumber
.extend()
sebagai gantinya digunakan sehingga dapat digunakan secara bersamaan, seperti yang Anda perhatikan. :-)self._stringio.truncate(0)
setelahself.extend()
panggilan dalam__exit__()
metode untuk melepaskan beberapa memori yang dipegang oleh_stringio
anggota.from io import StringIO
sebagai ganti baris pertama di pengelola konteks.Dalam python> = 3.4, contextlib berisi
redirect_stdout
dekorator. Ini dapat digunakan untuk menjawab pertanyaan Anda seperti:Dari dokumen :
sumber
f = io.StringIO() with redirect_stdout(f): logger = getLogger('test_logger') logger.debug('Test debug message') out = f.getvalue() self.assertEqual(out, 'DEBUG:test_logger:Test debug message')
. Ini memberi saya kesalahan:AssertionError: '' != 'Test debug message'
logger.debug
tidak menulis ke stdout secara default. Jika Anda mengganti panggilan logprint()
Anda dengan Anda akan melihat pesan.stream_handler = logging.StreamHandler(sys.stdout)
. Dan tambahkan handler itu ke logger saya. jadi harus menulis ke stdout danredirect_stdout
harus menangkapnya, bukan?Berikut adalah solusi async menggunakan pipa file.
Contoh penggunaan:
sumber