Pertanyaan Bagaimana cara mencetak ke stderr di Python 2?


Saya telah menemukan setidaknya tiga cara untuk mencetak ke stderr:

 import sys

 print >> sys.stderr, 'spam'

 sys.stderr.write('spam\n')

 from __future__ import print_function
 print('spam', file=sys.stderr)

Tampaknya bertentangan zen of Python # 13  , jadi apa cara yang lebih disukai untuk melakukannya? Apakah ada untung atau rugi untuk satu atau lain cara?

  Harus ada satu - dan sebaiknya hanya satu - cara yang jelas untuk melakukannya.


988
2018-04-07 00:59


asal


Jawaban:


Saya menemukan ini menjadi satu-satunya + fleksibel + portabel + terbaca pendek:

from __future__ import print_function
import sys

def eprint(*args, **kwargs):
    print(*args, file=sys.stderr, **kwargs)

Fungsi itu eprint dapat digunakan dengan cara yang sama seperti standar print fungsi:

>>> print("Test")
Test
>>> eprint("Test")
Test
>>> eprint("foo", "bar", "baz", sep="---")
foo---bar---baz

845
2018-02-20 13:31



sys.stderr.write() adalah pilihan saya, hanya lebih mudah dibaca dan mengatakan dengan tepat apa yang ingin Anda lakukan dan portabel di seluruh versi.

Edit: menjadi 'pythonic' adalah pemikiran ketiga bagi saya atas pembacaan dan kinerja ... dengan dua hal ini dalam pikiran, dengan python 80% dari kode Anda akan menjadi pythonic. daftar pemahaman menjadi 'hal besar' yang tidak sering digunakan (keterbacaan).


399
2018-04-07 01:03



Untuk Python 2 pilihan saya adalah: print >> sys.stderr, 'spam' Karena Anda dapat dengan mudah mencetak daftar / dicts dll tanpa mengubahnya menjadi string. print >> sys.stderr, {'spam': 'spam'} dari pada: sys.stderr.write(str({'spam': 'spam'}))


120
2017-11-08 17:29



print >> sys.stderr hilang dengan Python3. http://docs.python.org/3.0/whatsnew/3.0.html mengatakan:

Old: print >>sys.stderr, "fatal error"
New: print("fatal error", file=sys.stderr)

Sayangnya, ini cukup buruk. Atau, gunakan

sys.stderr.write("fatal error\n")

tetapi perhatikan itu write bukan pengganti 1: 1 untuk print.


97
2018-04-04 10:00



Tidak ada yang disebutkan logging Namun, penebangan dibuat khusus untuk mengkomunikasikan pesan kesalahan. Secara default sudah diatur untuk menulis ke stderr. Skrip ini:

# foo.py
import logging
logging.basicConfig(format='%(message)s')

logging.warn('I print to stderr by default')
logging.info('For this you must change the level and add a handler.')
print('hello world')

memiliki hasil sebagai berikut ketika dijalankan pada baris perintah:

$ python3 foo.py > bar.txt
I print to stderr by default

(dan bar.txt berisi 'hello world')


52
2017-12-23 16:04



Saya akan mengatakan bahwa pendekatan pertama Anda:

print >> sys.stderr, 'spam' 

adalah "Satu... jelas cara melakukannya "Yang lain tidak memenuhi aturan # 1 (" Indah lebih baik daripada jelek. ")


32
2018-04-07 01:05



Saya melakukan hal berikut menggunakan Python 3:

from sys import stderr

def print_err(*args, **kwargs):
    print(*args, file=stderr, **kwargs)

Jadi sekarang saya dapat menambahkan argumen kata kunci, misalnya, untuk menghindari pengembalian carriage:

print_err("Error: end of the file reached. The word ", end='')
print_err(word, "was not found")

28
2017-12-29 21:40



Ini akan meniru fungsi cetak standar tetapi output pada stderr

def print_err(*args):
    sys.stderr.write(' '.join(map(str,args)) + '\n')

18
2017-10-06 07:42