2009-06-02 50 views
24

Có bất kỳ ưu điểm hoặc nhược điểm cụ thể nào cho print hoặc stderr không?print vs stderr

Trả lời

32

Chúng chỉ là hai thứ khác nhau. print thường đi tới sys.stdout. Cần biết sự khác biệt giữa stdin, stdout, and stderr - tất cả đều có mục đích sử dụng của chúng.

Cụ thể, stdout nên được sử dụng cho đầu ra chương trình bình thường, trong khi stderr chỉ được dành riêng cho thông báo lỗi (thực thi chương trình bất thường). Có các tiện ích để tách các luồng này, cho phép người dùng mã của bạn phân biệt giữa đầu ra và lỗi bình thường.

+13

Cũng lưu ý stderr đó là không có bộ đệm, có thể hữu ích. – JimB

+6

Tôi sẽ tinh chỉnh từ ngữ câu trả lời của bạn để thay thế “đầu ra chương trình” bằng “đầu ra chương trình phi văn bản hoặc không phải trạng thái”. stderr cũng không nên được dành riêng cho các thông báo lỗi trong mọi trường hợp - ví dụ, một chương trình tải xuống stdout, được chuyển đến một chương trình khác, nhưng in tiến trình tải xuống vào stderr (được gọi là 'thoát ra' của đường ống). –

+0

@JimB theo nghĩa nào? – JinSnow

80

print có thể in trên bất kỳ đối tượng nào giống như tệp, bao gồm sys.stderr.

print >> sys.stderr, 'Text' 

Những lợi thế của việc sử dụng sys.stderr lỗi thay vì sys.stdout là:

  • Nếu người dùng chuyển hướng stdout vào một tập tin, cô vẫn thấy lỗi trên màn hình.
  • Không được lưu vào bộ đệm, vì vậy nếu sys.stderr được chuyển hướng đến tệp nhật ký thì sẽ ít có khả năng chương trình có thể bị lỗi trước khi lỗi được ghi lại.

Câu trả lời này được viết bằng Python 2. Đối với Python 3, hãy sử dụng print('Text', file=sys.stderr) để thay thế.

+1

+1. tuyệt quá! Tôi không biết thuộc tính này của 'in' – db42

30

Hãy cẩn thận: có một số sự tinh tế ở đây, bao gồm việc luồng có đi tới các thiết bị tương tác hay không. Điều ngạc nhiên nhất là trong Python 3 stderr là dòng đệm (ít nhất là trong Unix). Ví dụ, trong một cửa sổ terminal, sau đây in một số mỗi hai giây trong Python 2:

for n in range(5): 
    print >> sys.stderr, n,  # final comma to squelch newline character 
    time.sleep(2) 

trong khi Python 3, các bản in sau những con số tất cả cùng nhau khi kết thúc vòng lặp:

for n in range(5): 
    print(n, file=sys.stderr, end='') # print n to sys.stderr with no newline char 
    time.sleep(2) 
+4

Rất thú vị. Tôi tự hỏi tại sao họ quyết định đi con đường đó với Python 3? –

+0

Đó là dòng đệm trên một thiết bị đầu cuối, và đệm đầy đủ khi ghi vào một tập tin. :(FAIL. –

2

Rất hữu ích khi tách biệt stderr và stdout khi chạy tập lệnh của bạn bằng cách chuyển hướng chúng đến các tệp khác nhau. Tôi thường sử dụng stderr cho các thông điệp tường trình và để theo dõi dòng chảy của chương trình, nhưng sử dụng stdout cho các thông điệp hữu ích hơn mà tôi sẽ sử dụng chúng sau này.

Một cách khác để viết thư cho stderr là như ví dụ sau:

import sys 
sys.stderr.write("Error has occurred opening a file!") 
+2

Cool! :) log = sys.stderr.write; log ("hello") – AME