I wrote a script and I want it to be pipeable in bash. Something like:
echo "1stArg" | myscript.py
Is it possible? How?
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.
%%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.
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
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With