2010-05-02 29 views
10

Tôi đã viết một tập lệnh ngắn không bao giờ chấm dứt. Kịch bản lệnh này liên tục tạo ra đầu ra mà tôi phải kiểm tra mọi lúc và sau đó. Tôi đang chạy nó trên một máy tính phòng thí nghiệm thông qua SSH, và chuyển hướng đầu ra vào một tập tin trong thư mục public_html của tôi trên máy đó.Làm thế nào để làm cho chuyển hướng đầu ra shell (>) viết trong khi kịch bản vẫn đang chạy?

python script.py > ~/public_html/results.txt 

Tuy nhiên, kết quả không hiển thị ngay lập tức khi tôi làm mới địa chỉ. Kết quả hiển thị khi tôi chấm dứt chương trình, nhưng như tôi đã nói, nó không tự dừng lại. Chuyển hướng đó (>) có lười biếng với việc viết không? Có cách nào để liên tục (hoặc với một khoảng thời gian) cập nhật kết quả trong tệp không?

Hoặc là máy chủ web không cập nhật tệp trong khi tệp vẫn đang được ghi?

Trả lời

14

Bạn cần xả đầu ra sys.stdout.flush() (hoặc thứ hai) nếu bạn muốn xem nó ngay lập tức. Xem this

+0

Oh cảm ơn, tôi sẽ dùng thử ngay lập tức. Tôi không nghĩ rằng đó là _python_ đệm đầu ra. --chỉnh sửa: Tôi đã thử, nó không có sự khác biệt. do đó, hoặc '>' là bộ đệm hoặc máy chủ web. – noio

+0

Không bao giờ nhận xét trước đó, tôi đã mất kiên nhẫn. Nó vẫn không phải là "thời gian thực" nhưng đó có thể là bộ nhớ cache của trình duyệt. – noio

1

Tôi nghi ngờ tệp đang được ghi liên tục, nhưng máy chủ web báo cáo ngày sửa đổi của tệp là thời gian tệp được mở và do đó báo cáo rằng không có thay đổi nào đối với tệp đã xảy ra và kết quả đang được lưu trữ (hoặc tại máy chủ web hoặc tại máy khách).

Lần đầu tiên tôi sẽ thử tải lại cưỡng bức (Ctrl + F5 hoặc Ctrl + Shift + R hoặc Shift + <reload_button>) và xem điều đó có giúp ích hay không. Nếu không, thì bạn có thể thử cái gì khác.

Trong một vỏ riêng biệt trên máy chủ, làm

tail -f ~/public_html/results.txt 

in Tail ra n dòng cuối cùng của tập tin (trong đó n mặc định là 10), nhưng các tham số -f giám sát các tập tin và tiếp tục báo cáo đầu ra khi tệp phát triển. Điều này ít nhất sẽ cho bạn sự tự tin rằng các tập tin được viết để tăng dần.

Tôi hy vọng điều đó sẽ hữu ích.

+0

Cảm ơn, giải pháp của nc3b đã hoạt động. Đuôi hiển thị kết quả mới nhất khi chúng được viết. Chế độ xem trình duyệt cập nhật theo lô mỗi khoảng thời gian ngắn ngay bây giờ. Làm mới cưỡng bức không thay đổi điều đó. Nhưng nó đủ nhanh. – noio

5

stdout được đệm, nếu không được kết nối với thiết bị đầu cuối.

Bạn có thể thay đổi chính sách này để lót đệm qua stdbuf

stdbuf -oL python script.py > ~/public_html/results.txt 

Vì vậy, bạn không cần phải tuôn trong kịch bản Python của bạn và giữ nó IO hiệu quả, nếu dòng đệm là không cần thiết.

+0

Điều này sẽ kém hiệu quả hơn lệnh 'flush()' của python nếu được gọi là ít? Tôi sử dụng 'flush()' bây giờ và nó được gọi ít hơn một lần trên mỗi dòng. – noio

+0

Tôi nghi ngờ sẽ có một sự khác biệt, bởi vì dữ liệu sẽ rất có thể không được ghi vào đĩa nếu bạn không sử dụng tuôn ra (3). Nếu bạn sử dụng ứng dụng của mình trên bộ đệm dòng đầu cuối sẽ được đặt mặc định.Đối với các công việc nền chạy dài, việc chuyển hướng đến một tệp sẽ chọn bộ đệm hiệu quả hơn. Đối với các trường hợp đặc biệt như của bạn, bạn luôn có thể sử dụng stdbuf và do đó giữ mã IO ra khỏi ứng dụng của bạn, giữ cho nó linh hoạt và dễ đọc hơn. –

+1

Tôi có thể tìm stdbuf trên ubuntu ở đâu? dường như không được bao gồm trong gói coreutils – simao

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