chỉ nghĩ rằng tôi muốn thêm ý tưởng của mình ...phù hợp với mục đích của tôi là có thể chạy sthg trong Eclipse và sau đó chạy từ (Windows) CLI mà không nhận được mã hóa ngoại lệ với mỗi bản in. Bất cứ điều gì bạn không thực hiện EncodingStdout một lớp con của tệp lớp: dòng "self.encoding = encoding" sẽ dẫn đến thuộc tính encoding là Không! NB một điều tôi phát hiện ra trong một ngày vật lộn với công cụ này là ngoại lệ mã hóa được nâng lên TRƯỚC KHI nhận được "in" hoặc "viết": đó là khi chuỗi tham số (tức là "mondodod% s blah blah% s "% (" blip "," blap ")) được tạo bởi ... cái gì ??? Cơ cấu"?
class EncodingStdout(object):
def __init__(self, encoding='utf-8'):
self.encoding = encoding
def write_ln(self, *args):
if len(args) < 2:
sys.__stdout__.write(args[ 0 ] + '\n')
else:
if not isinstance(args[ 0 ], basestring):
raise Exception("first arg was %s, type %s" % (args[ 0 ], type(args[ 0 ])))
# if the default encoding is UTF-8 don't bother with encoding
if sys.getdefaultencoding() != 'utf-8':
encoded_args = [ args[ 0 ] ]
for i in range(1, len(args)):
# numbers (for example) do not have an attribute "encode"
if hasattr(args[ i ], 'encode'):
encoded_args.append(args[ i ].encode(self.encoding, 'replace'))
else:
encoded_args.append(args[ i ])
args = encoded_args
sys.__stdout__.write(args[ 0 ] % tuple(args[ 1 : ]) + '\n')
# write seems to need a flush
sys.__stdout__.flush()
def __getattr__(self, name):
return sys.__stdout__.__getattribute__(name)
print "=== A mondodod %s %s" % ("été", "pluviôse, irritée contre la ville entière")
sys.stdout = EncodingStdout()
sys.stdout.write_ln("=== B mondodod %s %s", "été", "pluviôse, irritée contre la ville entière")
# convenience method
def pr(*args):
sys.stdout.write_ln(*args)
pr("=== C mondodod %s %s", "été", "pluviôse, irritée contre la ville entière")
Nguồn
2014-02-22 19:05:39
'saved = sys.stdout' là không cần thiết,' sys .__ stdout__' luôn giữ nguyên 'stdout', do đó, ở cuối chỉ cần' sys.stdout = sys .__ stdout__'. – chown
lưu sys.stdout cho phép bạn ghi đè chuỗi; nếu bạn viết thẳng vào sys .__ stdout__ bạn sẽ bỏ qua bất kỳ khung công tác ghi nhật ký nào hoặc bạn thử và tiêm vào chương trình. Tốt nhất của nó để tiết kiệm một cách rõ ràng giá trị trước của stdout. – Will
Có lý do cụ thể nào bạn mở nhật ký bằng cách sử dụng 'file()' thay vì 'open()'? [Tài liệu đề nghị chống lại điều đó.] (Https://docs.python.org/2/library/functions.html#file) – Eric