ipython uses site._Helper as help() function. In some cases (specifically, when running in frozen pyInstaller setup), site.py is not have the same implementation as the one shipped with cpython. Since site._Helper is an internal function (leading underscore), there should be a fallback in case of ImporrError implementing site._Helper locally (http://hg.python.org/cpython/file/cf606c403f14/Lib/site.py#l445)
The workaround that exists for this doesn't completely work. The current workaround doesn't provide the built-in help function that site.py does. The fake-site.py does provide a minimal _Helper class. However, the real site.py also sets builtins.help = _Helper. So, using the IPython shell inside of something that was built with PyInstaller doesn't work.
builtins.help = _Helper
Are there any problems with adding the following to the fake-site.py?
import __builtin__ as builtins
builtins.help = _Helper()
I've successfully tested the above code with my scenario. However, I don't know enough about PyInstaller as a whole to know if it could cause issues elsewhere.
This should be solved on ipyhton's side. If we include pydoc in our fake-site-module, pydoc will be included in every frozen app. And pydoc imports Tkinter, thus adding another huge pile of software to every frozen app.
If you'd accept a pull-request following the idea of the first comment, I'll prepare one.