Tôi đang cố gắng in danh sách các bộ dữ liệu được định dạng trong số stdout
của tôi. Đối với điều này, tôi sử dụng phương pháp str.format. Tất cả mọi thứ hoạt động tốt, nhưng khi tôi đường ống đầu ra để xem các dòng đầu tiên bằng cách sử dụng lệnh head
một số IOError
xảy ra.Làm cách nào để tránh lỗi ống bị hỏng khi in một lượng lớn dữ liệu được định dạng?
Đây là mã của tôi:
# creating the data
data = []$
for i in range(0, 1000):
pid = 'pid%d' % i
uid = 'uid%d' % i
pname = 'pname%d' % i
data.append((pid, uid, pname))
# find max leghed string for each field
pids, uids, pnames = zip(*data)
max_pid = len("%s" % max(pids))
max_uid = len("%s" % max(uids))
max_pname = len("%s" % max(pnames))
# my template for the formatted strings
template = "{0:%d}\t{1:%d}\t{2:%d}" % (max_pid, max_uid, max_pname)
# print the formatted output to stdout
for pid, uid, pname in data:
print template.format(pid, uid, pname)
Và đây là lỗi tôi nhận được sau khi chạy lệnh: python myscript.py | head
Traceback (most recent call last):
File "lala.py", line 16, in <module>
print template.format(pid, uid, pname)
IOError: [Errno 32] Broken pipe
bất cứ ai có thể giúp tôi về vấn đề này?
Tôi cố gắng để đưa print
trong một khối try-except
để xử lý các lỗi, nhưng sau đó là một thông báo trong giao diện điều khiển:
close failed in file object destructor:
sys.excepthook is missing
lost sys.stderr
Tôi cũng đã cố gắng để tuôn ra ngay lập tức các dữ liệu thông qua một hai liên tiếp sys.stdout.write
và sys.stdout.flush
cuộc gọi, nhưng không có gì happend ..
Điều này xảy ra vì 'đầu' * đóng *' stdout', khiến 'in' thử và ghi vào tệp đã đóng. Bạn muốn thay thế điều gì? –
Ok, cảm ơn bạn! Tôi muốn tránh việc in các thông điệp đó trong bảng điều khiển. Tôi muốn sử dụng một biến thể của mã này cho một công cụ dòng lệnh. –
Câu hỏi này có thể trùng lặp; xem: http://stackoverflow.com/questions/11423225/why-does-my-python3-script-balk-at-piping-its-output-to-head-or-tail-sys-module –