2014-10-13 15 views
7
import time 

print 1 
time.sleep(5) 

Tôi đã chạy mã ở trên trong sổ tay IPython và tập lệnh thông thường một cách riêng biệt.Máy tính xách tay ipython KHÔNG được in cho đến khi toàn bộ chương trình hoàn tất

Trong IPython Notebook, nó không in số '1' cho đến khi time.sleep(5) kết thúc, trong khi ở tập lệnh thông thường, nó in số '1' trước và đi vào time.sleep(5). Điều gì sẽ xảy ra?

Ví dụ này chỉ minh họa vấn đề của tôi: Tôi sử dụng print để in ra một số văn bản ở mọi giai đoạn trong mã của tôi, mất nhiều thời gian để hoàn thành, để tôi có thể biết chương trình đã đến đâu. Tôi thấy điều này hoạt động tốt khi thực thi kịch bản, nhưng trong IPython Notebookprint thường bị chậm lại và mọi thứ được in ra khi toàn bộ chương trình kết thúc.

Có cách nào để giải quyết vấn đề này trong IPython Notebook không?

+0

máy tính xách tay phải đợi cho mã để kết thúc trước khi bạn nhìn thấy @PadraicCunningham đầu ra –

+1

: bạn không cần phải chờ đợi cho các kịch bản để kết thúc trước khi bạn có thể nhìn thấy đầu ra. Xem [câu trả lời của tôi] (http://stackoverflow.com/a/26352157/4279) – jfs

Trả lời

12

Đây là vấn đề về bộ đệm. Thêm sys.stdout.flush() sau khi in, để xem kết quả ngay lập tức. Bạn cũng có thể sử dụng lệnh python -u hoặc đặt PYTHONUNBUFFERED envvar. Xem Disable output buffering.

python sử dụng tính năng đệm đường nếu nó chạy tương tác (trong một thiết bị đầu cuối) và chặn bộ đệm (ví dụ: ~ bộ đệm byte 4K) nếu đầu ra được chuyển hướng. Hãy so sánh:

$ python your_script.py 

$ python your_script.py | cat 

Sản lượng bị trì hoãn trong trường hợp thứ hai.

Xem lý do thứ hai trong Q: Why not just use a pipe (popen())?

+0

Tôi gặp sự cố khi hiển thị đầu ra từ tác vụ triển khai gitlab python script và thêm 'sys.stdout.flush()' sau mỗi lệnh in đã giải quyết được vấn đề của tôi. Bây giờ đầu ra in ra khi kịch bản thực thi. –

Các vấn đề liên quan