Open Jupyter notebooks with a Keyboard Maestro macro
I have a startup item that launches a Jupyter notebook so that the server is always running in the background. It’s an attempt to reduce the friction of using the notebooks.
By default, Jupyter starts the server on port 8888 on localhost, but expects a token (a long hexadecimal string) before it’ll let you in. If you list the currently running servers in the terminal you can see the token and also the server’s working directory.
% jupyter-notebook list
Currently running servers:
http://localhost:8889/?token=…hex… :: /Users/robjwells
http://localhost:8888/?token=…hex… :: /Users/robjwells/jupyter-notebooks
We can use this to make finding and opening the particular notebook server you want a bit easier, using Keyboard Maestro.
The macro uses the jupyter-notebook
command, so that’ll need to be in your $PATH
as Keyboard Maestro sees it.
The first and third steps both execute jupyter-notebook list
and use Unix tools to extract parts from it.
In between, if there’s more than one notebook server running, the macro prompts the user to choose one from a list of their working directories.
Here’s the first step, where we fetch the list of working directories.
jupyter-notebook list | tail -n +2 | awk '{print $3}'
Our +2 argument to tail
gets the output from the second line, chopping off the “Currently running servers:” bit. Then awk
prints the third field, which contains the directory. (The first is the URL, the second the double-colon separator.)
The third step fetches the corresponding URL for a directory:
jupyter-notebook list | grep ":: $KMVAR_dir$" | awk '{ print $1 }'
Since the user has specified a directory already, we use grep
with the Keyboard Maestro variable to find just that one line, and use awk
again to extract the URL field.
Update:
There was a bug in the original version of this snippet of shell script, where a parent path could match a child path (as it was only looking for the path itself without an anchor on either side). It was only luck that had me miss this with my example, with the more recently started home directory notebook server being listed ahead of one in a subdirectory, which grep
would have also matched. The code above and the macro file have been fixed.
Obviously, this won’t work if you have more than one notebook server running from the same directory. (But you wouldn’t do that, right?)
Here’s the macro file if you’d like to try it out.