Tôi đang cố triển khai một cái gì đó tương tự như git log
, sẽ chỉ trang đầu ra nếu nhật ký có độ dài nhất định. Nếu bạn không quen thuộc với git, tôi về cơ bản cố gắng để đạt được điều này:Đầu ra phân trang từ python
python some_script.py | less
Với một số sự giúp đỡ từ việc thực hiện phân trang trong python2.6/pydoc.py, tôi đã có thể đưa ra với điều này:
import os
text = '...some text...'
pipe = os.popen('less', 'w')
pipe.write(text)
pipe.close()
hoạt động tốt nhưng os.popen() không được dùng nữa. Tôi đã xem xét việc viết một tập tin tạm thời và gọi ít hơn với đường dẫn của nó, nhưng điều đó không có vẻ lý tưởng. Điều này có thể với subprocess không? Bất kỳ ý tưởng nào khác?
CHỈNH SỬA:
Vì vậy, tôi đã nhận được quy trình phụ. Tôi đã có thể để cho nó biến văn bản với Popen.communicate(text)
, nhưng kể từ khi tôi thực sự muốn chuyển hướng báo cáo in, tôi đã giải quyết về vấn đề này:
import os, sys, subprocess, tempfile
page = True
if page:
path = tempfile.mkstemp()[1]
tmp_file = open(path, 'a')
sys.stdout = tmp_file
print '...some text...'
if page:
tmp_file.flush()
tmp_file.close()
p = subprocess.Popen(['less', path], stdin=subprocess.PIPE)
p.communicate()
sys.stdout = sys.__stdout__
Tất nhiên, tôi muốn kết thúc gói nó vào chức năng. Có ai nhìn thấy một vấn đề với điều đó không?
Một vài lưu ý: (1) tên tệp tạm thời là duy nhất: chế độ mở phải là 'w', không phải 'a' (không thể nối thêm vào tệp). (2) Không cần phải 'close()' tệp trước khi đọc nó. (3) Không cần phải giao tiếp với quá trình máy nhắn tin (đơn giản là 'subprocess.call()' suffices). (4) Rõ ràng hơn là không làm xáo trộn toàn cầu như 'sys.stdout'; trừ khi bạn thực sự cần phải làm điều này (như nếu bạn muốn chuyển hướng đầu ra của tất cả các mô-đun con mà bạn sử dụng), bạn nên gọi một cách rõ ràng chức năng in đặc biệt. – EOL
Đây là chủ đề tương tự với tốt đẹp và pithy Trả lời: http://stackoverflow.com/questions/37584717/how-to-write-python-script-with-man-page-like-out-put/ – user3019074