=====================
IPython extension API
=====================

IPython api (defined in IPython/ipapi.py) is the public api that
should be used for

 * Configuration of user preferences (.ipython/ipy_user_conf.py)
 * Creating new profiles (.ipython/ipy_profile_PROFILENAME.py)
 * Writing extensions 

Note that by using the extension api for configuration (editing
ipy_user_conf.py instead of ipythonrc), you get better validity checks
and get richer functionality - for example, you can import an
extension and call functions in it to configure it for your purposes.

For an example extension (the 'sh' profile), see
IPython/Extensions/ipy_profile_sh.py.

For the last word on what's available, see the source code of
IPython/ipapi.py.


Getting started
===============

If you want to define an extension, create a normal python module that
can be imported. The module will access IPython functionality through
the 'ip' object defined below.

If you are creating a new profile (e.g. foobar), name the module as
'ipy_profile_foobar.py' and put it in your ~/.ipython directory. Then,
when you start ipython with the '-p foobar' argument, the module is
automatically imported on ipython startup.

If you are just doing some per-user configuration, you can either 

 * Put the commands directly into ipy_user_conf.py. 

 * Create a new module with your customization code and import *that*
   module in ipy_user_conf.py. This is preferable to the first approach,
   because now you can reuse and distribute your customization code.

Getting a handle to the api
===========================

Put this in the start of your module::

    #!python
    import IPython.ipapi
    ip = IPython.ipapi.get()

The 'ip' object will then be used for accessing IPython
functionality. 'ip' will mean this api object in all the following
code snippets. The same 'ip' that we just acquired is always
accessible in interactive IPython sessions by the name _ip - play with
it like this::

    [~\_ipython]|81> a = 10
    [~\_ipython]|82> _ip.e
    _ip.ev           _ip.ex           _ip.expose_magic
    [~\_ipython]|82> _ip.ev('a+13')
                <82> 23

The _ip object is also used in some examples in this document - it can
be substituted by 'ip' in non-interactive use.

Changing options
================

The ip object has 'options' attribute that can be used te get/set
configuration options (just as in the ipythonrc file)::

    o = ip.options
    o.autocall = 2
    o.automagic = 1

Executing statements in IPython namespace with 'ex' and 'ev'
============================================================

Often, you want to e.g. import some module or define something that
should be visible in IPython namespace. Use ``ip.ev`` to
*evaluate* (calculate the value of) expression and ``ip.ex`` to
'''execute''' a statement::

    # path module will be visible to the interactive session
    ip.ex("from path import path" )

    # define a handy function 'up' that changes the working directory

    ip.ex('import os')
    ip.ex("def up(): os.chdir('..')")


    # _i2 has the input history entry #2, print its value in uppercase.
    print ip.ev('_i2.upper()')

Accessing the IPython namespace
===============================

ip.user_ns attribute has a dictionary containing the IPython global
namespace (the namespace visible in the interactive session).

::

    [~\_ipython]|84> tauno = 555
    [~\_ipython]|85> _ip.user_ns['tauno']
                <85> 555

Defining new magic commands
===========================

The following example defines a new magic command, %impall. What the
command does should be obvious::

    def doimp(self, arg):
        ip = self.api
        ip.ex("import %s; reload(%s); from %s import *" % (
        arg,arg,arg)
        )

    ip.expose_magic('impall', doimp)

Things to observe in this example:

 * Define a function that implements the magic command using the 
   ipapi methods defined in this document
 * The first argument of the function is 'self', i.e. the 
   interpreter object. It shouldn't be used directly. however. 
   The interpreter object is probably *not* going to remain stable 
   through IPython versions.
 * Access the ipapi through 'self.api' instead of the global 'ip' object.
 * All the text following the magic command on the command line is 
   contained in the second argument
 * Expose the magic by ip.expose_magic()


Calling magic functions and system commands
===========================================

Use ip.magic() to execute a magic function, and ip.system() to execute
a system command::

    # go to a bookmark
    ip.magic('%cd -b relfiles')

    # execute 'ls -F' system command. Interchangeable with os.system('ls'), really.
    ip.system('ls -F')

Launching IPython instance from normal python code
==================================================

Use ipapi.launch_new_instance() with an argument that specifies the
namespace to use. This can be useful for trivially embedding IPython
into your program. Here's an example of normal python program test.py
('''without''' an existing IPython session) that launches an IPython
interpreter and regains control when the interpreter is exited::

    [ipython]|1> cat test.py
    my_ns = dict(
        kissa = 15,
        koira = 16)
    import IPython.ipapi
    print "launching IPython instance"
    IPython.ipapi.launch_new_instance(my_ns)
    print "Exited IPython instance!"
    print "New vals:",my_ns['kissa'], my_ns['koira']

And here's what it looks like when run (note how we don't start it
from an ipython session)::

    Q:\ipython>python test.py
    launching IPython instance
    Py 2.5 (r25:51908, Sep 19 2006, 09:52:17) [MSC v.1310 32 bit (Intel)] IPy 0.7.3b3.r1975
    [ipython]|1> kissa = 444
    [ipython]|2> koira = 555
    [ipython]|3> Exit
    Exited IPython instance!
    New vals: 444 555

Accessing unexposed functionality
=================================

There are still many features that are not exposed via the ipapi. If
you can't avoid using them, you can use the functionality in
InteractiveShell object (central IPython session class, defined in
iplib.py) through ip.IP.

For example::

    [~]|7> _ip.IP.expand_aliases('np','myfile.py')
       <7> 'c:/opt/Notepad++/notepad++.exe myfile.py'
    [~]|8>

Still, it's preferable that if you encounter such a feature, contact
the IPython team and request that the functionality be exposed in a
future version of IPython. Things not in ipapi are more likely to
change over time.

Provided extensions
===================

You can see the list of available extensions (and profiles) by doing
``import ipy_<TAB>``. Some extensions don't have the ``ipy_`` prefix in
module name, so you may need to see the contents of IPython/Extensions
folder to see what's available.

You can see a brief documentation of an extension by looking at the
module docstring::

    [c:p/ipython_main]|190> import ipy_fsops
    [c:p/ipython_main]|191> ipy_fsops?

    ...

    Docstring:
        File system operations

    Contains: Simple variants of normal unix shell commands (icp, imv, irm,
    imkdir, igrep).

You can also install your own extensions - the recommended way is to
just copy the module to ~/.ipython. Extensions are typically enabled
by just importing them (e.g. in ipy_user_conf.py), but some extensions
require additional steps, for example::

    [c:p]|192> import ipy_traits_completer
    [c:p]|193> ipy_traits_completer.activate()    

Note that extensions, even if provided in the stock IPython
installation, are not guaranteed to have the same requirements as the
rest of IPython - an extension may require external libraries or a
newer version of Python than what IPython officially requires. An
extension may also be under a more restrictive license than IPython
(e.g. ipy_bzr is under GPL).

Just for reference, the list of bundled extensions at the time of
writing is below:

astyle.py clearcmd.py envpersist.py ext_rescapture.py ibrowse.py
igrid.py InterpreterExec.py InterpreterPasteInput.py ipipe.py
ipy_app_completers.py ipy_autoreload.py ipy_bzr.py ipy_completers.py
ipy_constants.py ipy_defaults.py ipy_editors.py ipy_exportdb.py
ipy_extutil.py ipy_fsops.py ipy_gnuglobal.py ipy_kitcfg.py
ipy_legacy.py ipy_leo.py ipy_p4.py ipy_profile_doctest.py
ipy_profile_none.py ipy_profile_scipy.py ipy_profile_sh.py
ipy_profile_zope.py ipy_pydb.py ipy_rehashdir.py ipy_render.py
ipy_server.py ipy_signals.py ipy_stock_completers.py
ipy_system_conf.py ipy_traits_completer.py ipy_vimserver.py
ipy_which.py ipy_workdir.py jobctrl.py ledit.py numeric_formats.py
PhysicalQInput.py PhysicalQInteractive.py pickleshare.py
pspersistence.py win32clip.py __init__.py