Saturday, May 18, 2019

Standalone IPython using PyInstaller and VirtualEnv


I decided that I want to create a standalone IPython executable that I can distribute.
This executable should be:

  • Run as a standalone, even if there is no Python installed on the machine
  • Have all required packages even if they aren't installed on the machine
  • Doesn't have extra packages in it (just what needed)
  • Single executable (no shared objects)


In order to achieve this task I used PyInstaller, which according to this StackOverflow post seems like one of the good options to do so.

I also wanted to make my environment as clean as possible, so I installed virtualenv:

virtualenv ipython_env/
source ipython_env/bin/activate

Inside this environment, I ran the following pip command to install PyInstaller and IPython:

pip install pyinstaller
pip install ipython 

Following rgtk's comment: https://stackoverflow.com/a/31412509/132847, I created the following script:

from IPython import embed
embed()

and called it ipython.py


From PyInstaller help manual:
  -F, --onefile         Create a one-file bundled executable.
then, I ran:
pyinstaller -F ipython.py


The output of the script generated a (default named) directory called dist which the output binary was in.

$ file dist/ipython
dist/ipython: Mach-O 64-bit executable x86_64

$ otool -L ./dist/ipython
./dist/ipython:
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1226.10.1)
/usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.5)

Running this binary:
$ ./dist/ipython
Python 2.7.16 (default, Apr 12 2019, 15:32:40)
Type "copyright", "credits" or "license" for more information.
IPython 5.8.0 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.
In [1]:


That's all for today.

Good luck!
Tal Kain