2010-05-12 39 views
7

Tôi đang cố gắng viết một công cụ đơn giản đọc tệp từ đĩa, thực hiện xử lý hình ảnh và trả về kết quả của thuật toán. Vì chương trình đôi khi có thể mất một lúc, tôi muốn có một thanh tiến trình để tôi biết nó ở đâu trong chương trình. Và vì tôi không muốn làm lộn xộn dòng lệnh của mình và tôi đang sử dụng nền tảng Unix, tôi muốn sử dụng ký tự '\ r' để in thanh tiến trình chỉ trên một dòng.Lệnh in Python in không có gì với một dấu xuống dòng

Nhưng khi tôi có mã này ở đây, nó sẽ không in được gì.

Tôi cũng đã cố gắng:


print '\r', i, '/', len(files), 

Bây giờ chỉ cần để đảm bảo điều này làm việc trong python, tôi đã cố gắng này:


heartbeat = 1 
while True: 
    print '\rHello, world', heartbeat, 
    heartbeat += 1 

Mã này hoạt động hoàn hảo. Chuyện gì vậy? Sự hiểu biết của tôi về lợi nhuận vận chuyển trên Linux là nó sẽ chỉ di chuyển các dòng thức ăn nhân vật vào đầu và sau đó tôi có thể ghi đè lên văn bản cũ đã được viết trước đây, miễn là tôi không in một dòng mới bất cứ nơi nào. Điều này dường như không xảy ra mặc dù.

Ngoài ra, có cách nào tốt hơn để hiển thị thanh tiến trình trong dòng lệnh so với những gì tôi hiện đang cố gắng thực hiện không?

+3

http://pypi.python.org/pypi/progressbar – kennytm

Trả lời

10

Hãy thử thêm sys.stdout.flush() sau khi báo cáo kết quả in. Có thể là print không xả đầu ra cho đến khi nó viết dòng mới, điều này không xảy ra ở đây.

+0

Đúng, điều đó đã xảy ra. Vẫn không hoàn toàn chắc chắn tại sao ví dụ thế giới hello lại hoạt động. Nó cũng không đưa ra một nguồn cấp dữ liệu dòng. Có lẽ vì câu lệnh in đang chạy đủ để nó tự động xóa bộ đệm sau một số ký tự nhất định? –

+0

Có, nó phải xả bộ đệm khi nó đã đầy. – interjay

+0

Hoặc, người ta có thể sử dụng 'sys.stderr' để in ngay lập tức vào màn hình. Theo mặc định 'stderr' không bị chặn. – amphetamachine

2

Xử lý trả về vận chuyển trong Linux khác nhau rất nhiều giữa các trình mô phỏng thiết bị đầu cuối.

Thông thường, người ta sẽ sử dụng các mã thoát thiết bị đầu cuối để cho trình mô phỏng thiết bị đầu cuối di chuyển "vận chuyển" ảo xung quanh màn hình (nghĩ các chương trình toàn màn hình chạy trên các dòng BBS). Những người tôi biết là các mã vt100 thoát:

\e[A: lên
\e[B: xuống
\e[C: right
\e[D: trái
\e[1~: nhà
\e[4~: cuối

Ở đâu \e là ký tự thoát, \x1b.

Hãy thử thay thế tất cả \r 's với \e[1~

Xem thêm this post

+0

Tại sao ví dụ thứ hai của bạn sẽ hoạt động? – danben

2

Nếu thiết bị đầu cuối của bạn là bộ đệm dòng, bạn có thể cần sys.stdout.flush() để xem việc in của mình nếu bạn không phát hành nguồn cấp dữ liệu dòng.

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