How to print to terminal like git log?

Question:

I’m writing a simple CLI application using python.
I have a list of records that I want to print in the terminal and I would like to output them just like git log does. So as a partial list you can load more using the down arrow, from which you quit by typing "q" (basically like the output of less, but without opening and closing a file).

How does git log do that?

Asked By: Enrico Bussetti

||

Answers:

You can pipe directly to a pager like this answer should work.

Alternatively, you can use a temporary file:

import os
import tempfile
import subprocess

# File contents for testing, replace with whatever
file = 'n'.join(f"{i} abc 123"*15 for i in range(400))

# Save the file to the disk
with tempfile.NamedTemporaryFile('w+', delete=False) as f:
        f.write(file)

# Run `less` on the saved file
subprocess.check_call(["less", f.name])

# Delete the temporary file now that we are done with it.
os.unlink(f.name)
Answered By: mousetail

How does git log do that?

git log invokes less when the output will not fit on the terminal. You can check that by running git log (if the repo doesn’t have a lot of commits you can just resize the terminal before running the command) and then checking the running processes like so ps aux | grep less

Answered By: makeVoiceBot

Device you are looking for is called pager, there exists pipepager function inside pydoc, which is not documented in linked pydoc docs, but using interactive python console you might learn that

>>> help(pydoc.pipepager)
Help on function pipepager in module pydoc:

pipepager(text, cmd)
    Page through text by feeding it to another program.

therefore it seems that you should use this as follows

import pydoc
pydoc.pipepager("your text here", "less")

with limitation that it does depends on availability of less command.

Answered By: Daweo
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.