I did some further testing. With my patch, my real org-mode python file is now actually working. There were a few gotchas I didn't understand about session mode and python and matplotlib:
1. In session mode, you are essentially running an interactive python. (This is made explicit by my patch, which passes -i).
2. In interactive mode, blank lines are special: they indicate the end of an indented block. So you have to write your org-mode python a little differently when using session mode.
3. matplotlib uses an "interactive" backend when started from an interactive python (sensibly). So you have to set the backend explicitly when using session mode, or it hangs forever with no indication what's wrong.
4. ob-python does not handle python errors at all in session mode: it ignores them silently. This makes it really hard to debug the python code.