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
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.
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. tuyệt quá! Tôi không biết thuộc tính này của 'in' – db42
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)
Rất thú vị. Tôi tự hỏi tại sao họ quyết định đi con đường đó với Python 3? –
Đó 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. –
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!")
Cool! :) log = sys.stderr.write; log ("hello") – AME
- 1. Suppress stdout/stderr print từ các hàm Python
- 2. Khi nào nên sử dụng $ stderr vs STDERR trong Ruby?
- 3. print() vs sys.stdout.write(): cái nào và tại sao?
- 4. TSQL PRINT statement conversion issue
- 5. In qua Google Cloud Print
- 6. Google Cloud Print bằng C#
- 7. Python 2.7: Print to File
- 8. java stderr đi đâu?
- 9. Gửi STDERR đến logger
- 10. PHP StdErr sau Exec()
- 11. Đặt màu chữ stdout/stderr trong Windows
- 12. Xem print css trong trình duyệt
- 13. bash: print: lệnh không tìm thấy
- 14. echo/print issue in php while loop
- 15. print css: vừa với một trang
- 16. Truy cập Google Cloud Print trong android
- 17. Dòng mới trong hàm print python()
- 18. "cerr" và "stderr" là gì?
- 19. Về stdout/stderr chuyển hướng
- 20. Sao chép stdout thành stderr
- 21. Chụp stdout/stderr với NDK
- 22. Redirect stderr để Logger dụ
- 23. Cách chuyển hướng STDOUT và STDERR sang biến số
- 24. UseConcMarkSweepGC vs UseParallelGC
- 25. c popen sẽ không bắt stderr
- 26. Piping cả stdout và stderr trong bash?
- 27. bộ lọc vim và stdout/stderr
- 28. Có thể tắt stderr trong C++ không?
- 29. Cách chụp stderr trên Windows/DOS?
- 30. Đọc stderr của subprocess trong khi nó đang thực hiện
Cũng lưu ý stderr đó là không có bộ đệm, có thể hữu ích. – JimB
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). –
@JimB theo nghĩa nào? – JinSnow