Saya memiliki proyek besar yang terdiri dari sejumlah besar modul, masing-masing mencetak sesuatu dengan output standar. Sekarang karena proyek telah tumbuh dalam ukuran, ada yang tidak besar. dari print
pernyataan mencetak banyak di luar std yang telah membuat program lebih lambat.
Jadi, saya sekarang ingin memutuskan pada saat runtime apakah akan mencetak sesuatu ke stdout atau tidak. Saya tidak dapat membuat perubahan dalam modul karena ada banyak dari mereka. (Saya tahu saya bisa mengarahkan stdout ke file tetapi bahkan ini sangat lambat.)
Jadi pertanyaan saya adalah bagaimana cara mengarahkan stdout ke nol yaitu bagaimana saya membuat print
pernyataan tidak melakukan apa-apa?
# I want to do something like this.
sys.stdout = None # this obviously will give an error as Nonetype object does not have any write method.
Saat ini satu-satunya ide yang saya miliki adalah membuat kelas yang memiliki metode tulis (yang tidak melakukan apa-apa) dan mengarahkan stdout ke turunan dari kelas ini.
class DontPrint(object):
def write(*args): pass
dp = DontPrint()
sys.stdout = dp
Apakah ada mekanisme inbuilt di python untuk ini? Atau ada sesuatu yang lebih baik dari ini?
sumber
Jawaban:
Lintas-platform:
Di Windows:
Di Linux:
sumber
sys.stdout
dan atur kembali setelahnya. Misalnyaold_stdout = sys.stdout
sebelum salah satu kode lainnya, makasys.stdout = old_stdout
ketika Anda selesai.os.write(1, b'abc\n')
,. Anda perluos.dup2()
, untuk mengarahkan ulang di tingkat deskriptor file, lihatstdout_redirected()
sys.__stdout__
untuk membatalkan pengalihan. Jadi Anda cukup melakukannyasys.stdout = sys.__stdout__
dan tidak perlu menyimpan cadangan.Cara yang baik untuk melakukan ini adalah membuat prosesor konteks kecil yang Anda bungkus cetakan Anda. Anda kemudian hanya menggunakan dalam-
with
pernyataan untuk membungkam semua output.Python 2:
Python 3.4+:
Python 3.4 memiliki pengolah konteks seperti ini bawaan, jadi Anda cukup menggunakan contextlib seperti ini:
Menjalankan kode ini hanya mencetak output baris kedua, bukan yang pertama:
Ini bekerja lintas-platform (Windows + Linux + Mac OSX), dan lebih bersih daripada yang lainnya.
sumber
Jika Anda menggunakan python 3.4 atau lebih tinggi, ada solusi sederhana dan aman menggunakan perpustakaan standar:
sumber
with contextlib.redirect_stdout(None)
berfungsi jugaAttributeError: 'NoneType' object has no attribute 'write'
write
metode dummy yang tidak melakukan apa-apa. Lihat jawaban saya di bawah ini.(setidaknya pada sistem saya) tampaknya menulis ke os.devnull sekitar 5x lebih cepat daripada menulis ke kelas DontPrint, yaitu
memberikan hasil sebagai berikut:
sumber
Jika Anda berada di lingkungan Unix (termasuk Linux), Anda dapat mengarahkan output ke
/dev/null
:Dan untuk Windows:
sumber
nul = myfunc()
?Bagaimana dengan ini:
Ini menggunakan fitur-fitur dalam modul contextlib untuk menyembunyikan output dari perintah apa pun yang Anda coba jalankan, tergantung pada hasil
should_hide_output()
, dan kemudian mengembalikan perilaku output setelah fungsi tersebut selesai dijalankan.Jika Anda ingin menyembunyikan output kesalahan standar, maka impor
redirect_stderr
daricontextlib
dan tambahkan pepatah barisstack.enter_context(redirect_stderr(null_stream))
.Kelemahan utama bahwa ini hanya berfungsi di Python 3.4 dan versi yang lebih baru.
sumber
redirect_stdout()
analog pada versi Python sebelumnya (misalnya menggunakancontextlib.contextmanager
) .Kelas Anda akan berfungsi dengan baik (dengan pengecualian
write()
nama metode - perlu dipanggilwrite()
, huruf kecil). Pastikan Anda menyimpan salinan darisys.stdout
variabel lain.Jika Anda menggunakan * NIX, Anda bisa melakukannya
sys.stdout = open('/dev/null')
, tetapi ini lebih portabel daripada menggulung kelas Anda sendiri.sumber
Anda bisa mengejeknya.
sumber
Kenapa kamu tidak mencoba ini?
sumber
Tidak masalah untuk
print()
kasus ini. Tetapi itu dapat menyebabkan kesalahan jika Anda memanggil metode sys.stdout, misalnyasys.stdout.write()
.Ada catatan dalam dokumen :
sumber
sys.stdout = Null
sehingga dalam beberapa kasus itu bisa berbahaya.Tambahan untuk jawaban iFreilicht - ini berfungsi untuk kedua python 2 & 3.
sumber