Python help from the shell -- greppable and saveable
I'm working on a project involving PyQt5 (on which, more later). One of the problems is that there's not much online documentation, and it's hard to find out details like what signals (events) each widget offers.
Like most Python packages, there is inline help in the source, which means that in the Python console you can say something like
>>> from PyQt5.QtWebEngineWidgets import QWebEngineView >>> help(QWebEngineView)The problem is that it's ordered alphabetically; if you want a list of signals, you need to read through all the objects and methods the class offers to look for a few one-liners that include "unbound PYQT_SIGNAL".
If only there was a way to take help(CLASSNAME)
and
pipe it through grep!
A web search revealed that plenty of other people have wished for this,
but I didn't see any solutions. But when I tried running
python -c "help(list)"
it worked fine -- help
isn't dependent on the console.
That means that you should be able to do something like
python -c "from sys import exit; help(exit)"
Sure enough, that worked too.
From there it was only a matter of setting up a zsh function
to save on complicated typing. I set up separate aliases for
python2, python3 and whatever the default python is.
You can get help on builtins (pythonhelp list
)
or on objects in modules (pythonhelp sys.exit
).
The zsh suffixes :r (remove extension) and :e (extension)
came in handy for separating the module name, before the last
dot, and the class name, after the dot.
############################################################# # Python help functions. Get help on a Python class in a # format that can be piped through grep, redirected to a file, etc. # Usage: pythonhelp [module.]class [module.]class ... pythonXhelp() { python=$1 shift for f in $*; do if [[ $f =~ '.*\..*' ]]; then module=$f:r obj=$f:e s="from ${module} import ${obj}; help($obj)" else module='' obj=$f s="help($obj)" fi $python -c $s done } alias pythonhelp="pythonXhelp python" alias python2help="pythonXhelp python2" alias python3help="pythonXhelp python3"
So now I can type
python3help PyQt5.QtWebEngineWidgets.QWebEngineView | grep PYQT_SIGNALand get that list of signals I wanted.
[ 14:12 May 23, 2017 More programming | permalink to this entry | ]