How to integrate Linux pipe in your Python program

Jeff posted on  (updated on )

What is Linux pipe

Generally, you can redirect/channeling stdin/out from one program to another under a CLI:

# some examples
echo $SHELL > shell.txt
cat shell.txt | grep zsh

Handling text data

import argparse
import sys

def parse():
    desc = "Reverse text file content"
    parser = argparse.ArgumentParser(description=desc)

    # default to stdin
    # so if no file given, we read from stdin
    parser.add_argument("files", nargs="*", default=sys.stdin, type=argparse.FileType('r'))
    
    argv = parser.parse_args()

    files = argv.files
    return files

def reverse_content(files):
    if type(files) is list:
        # if file given, some codes here
        pass
    else:
        # read from stdin
        content = files.read()

        # output to stdout
        sys.stdout.write(content[::-1])

if __name__ == '__main__':
    files = parse()
    reverse_content(files)

Example:

echo "ABCDEFG" | python playground.py
# output: GFEDCBA

Handling binary data

import argparse
import sys

def parse():
    desc = "Reverse any file content"
    parser = argparse.ArgumentParser(description=desc)

    # Instead of stdin
    # We read binary data from buffer 
    parser.add_argument("files", nargs="*", default=sys.stdin.buffer, type=argparse.FileType('rb'))
    
    argv = parser.parse_args()
    files = argv.files

    return files

def reverse_content(files):
    if type(files) is list:
        # if file given... some codes here
        pass
    else:
        # read directly from buffer of the stdin
        content = files.read()
        # type(content) == bytes

        # output binary data to buffer, two
        sys.stdout.buffer.write(content[::-1])

if __name__ == '__main__':
    files = parse()
    reverse_content(files)