Tôi đã gặp phải một tình huống hơi bất thường. Tôi đang cố gắng để kịch bản giao diện điều khiển tương tác (cho mục đích giảng dạy/thử nghiệm), và tôi thử như sau:Đầu ra tương tác của dấu nhắc ">>>" của Python ở đâu?
$ python > /dev/null
Python 2.7.3 (v2.7.3:70274d53c1dd, Apr 9 2012, 20:52:43)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> print 3
>>>
3
không được in, vì vậy rõ ràng mọi thứ khác là trên stderr
. Càng xa càng tốt. Nhưng sau đó chúng tôi chuyển hướng stderr
:
$ python 2> /dev/null
>>> print 3
3
>>>
Làm cách nào để được in trong cả hai trường hợp?
CHỈNH SỬA: Chuyển hướng cả hai stdout
và stderr
hoàn toàn không có nội dung nào được in. Vì vậy, Python rõ ràng "chọn" một trong số stdout
hoặc stderr
. Tài liệu đó có xảy ra không? Tôi không thể hiểu được điều này thực sự được thực hiện như thế nào trong mã nguồn Python.
Huh, thật lạ lùng. Có lẽ nó kiểm tra 'isatty'? – delnan
Đó là dự đoán của tôi, nhưng tôi dường như không thể tìm ra nơi Python thực sự làm điều này. Điều kỳ lạ nhất là 'PyOS_StdioReadline', hàm xuất hiện chịu trách nhiệm đọc đầu vào, được mã hóa cứng để in dấu nhắc tới' stderr'. Nếu 'stderr' được chuyển hướng đến' stdout', như ví dụ thứ hai cho thấy, chúng ta sẽ thấy biểu ngữ. – nneonneo
Có thể dễ dàng hơn khi sử dụng một công cụ được thiết kế để dạy Python, như [tính năng sổ tay của ipython] (http://ipython.org/notebook.html). –