Tuesday Tooling: sh
The return of Tuesday Tooling and we start with a little Python module for when we need to "just run that one terminal command".
So What Is It?
The project is called sh and "sh is a full-fledged subprocess replacement for Python 2.6 - 3.8, PyPy and PyPy3 that allows you to call any program as if it were a function:".
Using sh we can call terminal commands direct from our Python code in the most simple and elegant manner!
Sh was created by Andrew Moffat and the project can be found on GitHub.
I discovered this module via a tweet from Mike Driscoll. Many thanks to Mike for this discovery!
So How Do I Install It?
Via pip for Linux and (I believe) Mac.
pip3 install sh
Hi reader!
So How Do I Use It?
The hello world test for this module is to print the contents of a directory. Open a terminal and in a Python shell type.
import sh
sh.ls("/home/<YOUR USERNAME>")
For my test I used my home directory, and the output was as follows.
>>> sh.ls("/home/les")
Desktop Documents Downloads Music Pictures Public snap Templates Videos
>>>
So I Can Run Any Terminal Command?
Well yes you can!
You can use sh.echo("Hello World")
to print / echo to the shell.
More interestingly, we can also call applications directly from Python.
Here is a quick example where I use sh to open VLC and then pass a YouTube URL to VLC in the parenthesis.
sh.vlc("https://youtu.be/3jJxKvjQrRg")
So Why Not Use Subprocess?
I've used subprocess a few times, and it is immensely powerful. I like to think of sh as "subprocess zero" in a similar manner to GPIO Zero is an easier way to use the GPIO on a Raspberry Pi.
To run the same VLC command we can use subprocess.run()
or we can use subprocess.Popen()
. Both have the same structure.
subprocess.run(['vlc https://youtu.be/3jJxKvjQrRg'], shell = True)
Or
subprocess.Popen(['vlc https://youtu.be/3jJxKvjQrRg'], shell = True)
We call the run / Popen and then pass subprocess the name of the command to run, and in our case the URL of the YouTube video. This is passed as a string. At the end of the line we use shell = True
which ensures that the arguments are passed as a string.
So subprocess can do the same job as sh. But with sh it is far easier for those of us that "just want to get the job done" or for those new to the task.