Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to make a python script "pipeable" in bash?

Tags:

python

pipe

I wrote a script and I want it to be pipeable in bash. Something like:

echo "1stArg" | myscript.py 

Is it possible? How?

like image 715
gbr Avatar asked Dec 13 '10 14:12

gbr


People also ask

Can you run a Python script in a bash script?

We can make use of the bash script to run the Python script in macOS/Ubuntu. Both these operating systems support bash scripts. Let's see the steps to run Python scripts using a bash script. Open any text editor.

What is %% bash in Python?

%%bash. Means, that the following code will be executed by bash. In bash $() means it will return with the result of the commands inside the parentheses, in this case the commands are: gcloud config list project --format "value(core.project)" Google cloud has its own command set to control your projects.


2 Answers

See this simple echo.py:

import sys  if __name__ == "__main__":     for line in sys.stdin:         sys.stderr.write("DEBUG: got line: " + line)         sys.stdout.write(line) 

running:

ls | python echo.py 2>debug_output.txt | sort 

output:

echo.py test.py test.sh 

debug_output.txt content:

DEBUG: got line: echo.py DEBUG: got line: test.py DEBUG: got line: test.sh 
like image 71
khachik Avatar answered Sep 22 '22 06:09

khachik


I'll complement the other answers with a grep example that uses fileinput to implement the typical behaviour of UNIX tools: 1) if no arguments are specified, it reads data from stdin; 2) many files can be specified as arguments; 3) a single argument of - means stdin.

import fileinput import re import sys  def grep(lines, regexp):     return (line for line in lines if regexp.search(line))  def main(args):     if len(args) < 1:         print("Usage: grep.py PATTERN [FILE...]", file=sys.stderr)         return 2      regexp = re.compile(args[0])     input_lines = fileinput.input(args[1:])     for output_line in grep(input_lines, regexp):         sys.stdout.write(output_line)  if __name__ == '__main__':     sys.exit(main(sys.argv[1:])) 

Example:

$ seq 1 20 | python grep.py "4" 4 14 
like image 36
tokland Avatar answered Sep 23 '22 06:09

tokland