|
|
=====================
|
|
|
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
|