##// END OF EJS Templates
Merging with upstream trunk
Merging with upstream trunk

File last commit:

r1248:19e3b286
r2356:68c38d4a merge
Show More
ipnb_google_soc.lyx
645 lines | 17.0 KiB | text/plain | TextLexer
/ docs / attic / ipnb_google_soc.lyx
fperez
Reorganized the directory for ipython/ to have its own dir, which is a bit...
r0 #LyX 1.3 created this file. For more info see http://www.lyx.org/
\lyxformat 221
\textclass article
\begin_preamble
\usepackage{hyperref}
\usepackage{color}
\definecolor{orange}{cmyk}{0,0.4,0.8,0.2}
\definecolor{brown}{cmyk}{0,0.75,0.75,0.35}
% Use and configure listings package for nicely formatted code
\usepackage{listings}
\lstset{
language=Python,
basicstyle=\small\ttfamily,
commentstyle=\ttfamily\color{blue},
stringstyle=\ttfamily\color{brown},
showstringspaces=false,
breaklines=true,
postbreak = \space\dots
}
\end_preamble
\language english
\inputencoding auto
\fontscheme palatino
\graphics default
\paperfontsize 11
\spacing single
\papersize Default
\paperpackage a4
\use_geometry 1
\use_amsmath 0
\use_natbib 0
\use_numerical_citations 0
\paperorientation portrait
\leftmargin 1in
\topmargin 0.9in
\rightmargin 1in
\bottommargin 0.9in
\secnumdepth 3
\tocdepth 3
\paragraph_separation skip
\defskip medskip
\quotes_language english
\quotes_times 2
\papercolumns 1
\papersides 1
\paperpagestyle default
\layout Title
Interactive Notebooks for Python
\newline
\size small
An IPython project for Google's Summer of Code 2005
\layout Author
Fernando P
\begin_inset ERT
status Collapsed
\layout Standard
\backslash
'{e}
\end_inset
rez
\begin_inset Foot
collapsed true
\layout Standard
\family typewriter
\size small
Fernando.Perez@colorado.edu
\end_inset
\layout Abstract
This project aims to develop a file format and interactive support for documents
which can combine Python code with rich text and embedded graphics.
The initial requirements only aim at being able to edit such documents
with a normal programming editor, with final rendering to PDF or HTML being
done by calling an external program.
The editing component would have to be integrated with IPython.
\layout Abstract
This document was written by the IPython developer; it is made available
to students looking for projects of interest and for inclusion in their
application.
\layout Section
Project overview
\layout Standard
Python's interactive interpreter is one of the language's most appealing
features for certain types of usage, yet the basic shell which ships with
the language is very limited.
Over the last few years, IPython
\begin_inset Foot
collapsed true
\layout Standard
\begin_inset LatexCommand \htmlurl{http://ipython.scipy.org}
\end_inset
\end_inset
has become the de facto standard interactive shell in the scientific computing
community, and it enjoys wide popularity with general audiences.
All the major Linux distributions (Fedora Core via Extras, SUSE, Debian)
and OS X (via fink) carry IPython, and Windows users report using it as
a viable system shell.
\layout Standard
However, IPython is currently a command-line only application, based on
the readline library and hence with single-line editing capabilities.
While this kind of usage is sufficient for many contexts, there are usage
cases where integration in a graphical user interface (GUI) is desirable.
\layout Standard
In particular, we wish to have an interface where users can execute Python
code, input regular text (neither code nor comments) and keep inline graphics,
which we will call
\emph on
Python notebooks
\emph default
.
This kind of system is very popular in scientific computing; well known
implementations can be found in Mathematica
\begin_inset ERT
status Collapsed
\layout Standard
\backslash
texttrademark
\end_inset
\SpecialChar ~
\begin_inset Foot
collapsed true
\layout Standard
\begin_inset LatexCommand \htmlurl{http://www.wolfram.com/products/mathematica}
\end_inset
\end_inset
and Maple
\begin_inset ERT
status Collapsed
\layout Standard
\backslash
texttrademark
\end_inset
\SpecialChar ~
\begin_inset Foot
collapsed true
\layout Standard
\begin_inset LatexCommand \htmlurl{http://www.maplesoft.com}
\end_inset
\end_inset
, among others.
However, these are proprietary (and quite expensive) systems aimed at an
audience of mathematicians, scientists and engineers.
\layout Standard
The full-blown implementation of a graphical shell supporting this kind
of work model is probably too ambitious for a summer project.
Simultaneous support for rich-text editing, embedded graphics and syntax-highli
ghted code is extremely complex, and likely to require far more effort than
can be mustered by an individual developer for a short-term project.
\layout Standard
This project will thus aim to build the necessary base infrastructure to
be able to edit such documents from a plain text editor, and to render
them to suitable formats for printing or online distribution, such as HTML,
PDF or PostScript.
This model follows that for the production of LaTeX documents, which can
be edited with any text editor.
\layout Standard
Such documents would be extremely useful for many audiences beyond scientists:
one can use them to produce additionally documented code, to explore a
problem with Python and maintain all relevant information in the same place,
as a way to distribute enhanced Python-based educational materials, etc.
\layout Standard
Demand for such a system exists, as evidenced by repeated requests made
to me by IPython users over the last few years.
Unfortunately IPython is only a spare-time project for me, and I have not
had the time to devote to this, despite being convinced of its long term
value and wide appeal.
\layout Standard
If this project is successful, the infrastructure laid out by it will be
immediately useful for Python users wishing to maintain `literate' programs
which include rich formatting.
In addition, this will open the door for the future development of graphical
shells which can render such documents in real time: this is exactly the
development model successfully followed by the LyX
\begin_inset Foot
collapsed true
\layout Standard
\begin_inset LatexCommand \htmlurl{http://www.lyx.org}
\end_inset
\end_inset
document processing system.
\layout Section
Implementation effort
\layout Subsection
Specific goals
\layout Standard
This is a brief outline of the main points of this project.
The next section provides details on all of them.
The student(s) working on the project would need to:
\layout Enumerate
Make design decisions for the internal file structure to enable valid Python
notebooks.
\layout Enumerate
Implement the rendering library, capable of processing an input notebook
through reST or LaTeX and producing HTML or PDF output, as well as exporting
a `pure-code' Python file stripped of all markup calls.
\layout Enumerate
Study existing programming editor widgets to find the most suitable one
for extending with an IPython connector for interactive execution of the
notebooks.
\layout Subsection
Complexity level
\layout Standard
This project is relatively complicated.
While I will gladly assist the student with design and implementation issues,
it will require a fair amount of thinking in terms of overall library architect
ure.
The actual implementation does not require any sophisticated concepts,
but rather a reasonably broad knowledge of a wide set of topics (markup,
interaction with external programs and libraries, namespace tricks to provide
runtime changes in the effect of the markup calls, etc.)
\layout Standard
While raw novices are welcome to try, I suspect that it may be a bit too
much for them.
Students wanting to apply should keep in mind, if the money is an important
consideration, that Google only gives the $4500 reward upon
\emph on
successful completion
\emph default
of the project.
So don't bite more than you can chew.
Obviously if this doesn't matter, anyone is welcome to participate, since
the project can be a very interesting learning experience, and it will
provide a genuinely useful tool for many.
\layout Section
Technical details
\layout Subsection
The files
\layout Standard
A basic requirement of this project will be that the Python notebooks shall
be valid Python source files, typically with a
\family typewriter
.py
\family default
extension.
A renderer program can be used to process the markup calls in them and
generate output.
If run at a regular command line, these files should execute like normal
Python files.
But when run via a special rendering script, the result should be a properly
formatted file.
Output formats could be PDF or HTML depending on user-supplied options.
\layout Standard
A reST markup mode should be implemented, as reST is already widely used
in the Python community and is a very simple format to write.
The following is a sketch of what such files could look like using reST
markup:
\layout Standard
\begin_inset ERT
status Open
\layout Standard
\backslash
lstinputlisting{nbexample.py}
\end_inset
\layout Standard
Additionally, a LaTeX markup mode should also be implemented.
Here's a mockup example of what code using the LaTeX mode could look like.
\layout Standard
\begin_inset ERT
status Open
\layout Standard
\backslash
lstinputlisting{nbexample_latex.py}
\end_inset
\layout Standard
At this point, it must be noted that the code above is simply a sketch of
these ideas, not a finalized design.
An important part of this project will be to think about what the best
API and structure for this problem should be.
\layout Subsection
From notebooks to PDF, HTML or Python
\layout Standard
Once a clean API for markup has been specified, converters will be written
to take a python source file which uses notebook constructs, and generate
final output in printable formats, such as HTML or PDF.
For example, if
\family typewriter
nbfile.py
\family default
is a python notebook, then
\layout LyX-Code
$ pynb --export=pdf nbfile.py
\layout Standard
should produce
\family typewriter
nbfile.pdf
\family default
, while
\layout LyX-Code
$ pynb --export=html nbfile.py
\layout Standard
would produce an HTML version.
The actual rendering will be done by calling appropriate utilities, such
as the reST toolchain or LaTeX, depending on the markup used by the file.
\layout Standard
Additionally, while the notebooks will be valid Python files, if executed
on their own, all the markup calls will still return their results, which
are not really needed when the file is being treated as pure code.
For this reason, a module to execute these files turning the markup calls
into no-ops should be written.
Using Python 2.4's -m switch, one can then use something like
\layout LyX-Code
$ python -m notebook nbfile.py
\layout Standard
and the notebook file
\family typewriter
nbfile.py
\family default
will be executed without any overhead introduced by the markup (other than
making calls to functions which return immediately).
Finally, an exporter to clean code can be trivially implemented, so that:
\layout LyX-Code
$ pynb --export=python nbfile.py nbcode.py
\layout Standard
would export only the code in
\family typewriter
nbfile.py
\family default
to
\family typewriter
nbcode.py
\family default
, removing the markup completely.
This can be used to generate final production versions of large modules
implemented as notebooks, if one wants to eliminate the markup overhead.
\layout Subsection
The editing environment
\layout Standard
The first and most important part of the project should be the definition
of a clean API and the implementation of the exporter modules as indicated
above.
Ultimately, such files can be developed using any text editor, since they
are nothing more than regular Python code.
\layout Standard
But once these goals are reached, further integration with an editor will
be done, without the need for a full-blown GUI shell.
In fact, already today the (X)Emacs editors can provide for interactive
usage of such files.
Using python-mode in (X)Emacs, one can pass highlighted regions of a file
for execution to an underlying python process, and the results are printed
in the python window.
With recent versions of python-mode, IPython can be used instead of the
plain python interpreter, so that IPython's extended interactive capabilities
become available within (X)Emacs (improved tracebacks, automatic debugger
integration, variable information, easy filesystem access to Python, etc).
\layout Standard
But even with IPython integration, the usage within (X)Emacs is not ideal
for a notebook environment, since the python process buffer is separate
from the python file.
Therefore, the next stage of the project will be to enable tighter integration
between the editing and execution environments.
The basic idea is to provide an easy way to mark regions of the file to
be executed interactively, and to have the output inserted automatically
into the file.
The following listing is a mockup of what the resulting file could look
like
\layout Standard
\begin_inset ERT
status Open
\layout Standard
\backslash
lstinputlisting{nbexample_output.py}
\end_inset
\layout Standard
Basically, the editor will execute
\family typewriter
add(2,3)
\family default
and insert the string representation of the output into the file, so it
can be used for rendering later.
\layout Section
Available resources
\layout Standard
IPython currently has all the necessary infrastructure for code execution,
albeit in a rather messy code base.
Most I/O is already abstracted out, a necessary condition for embedding
in a GUI (since you are not writing to stdout/err but to the GUI's text
area).
\layout Standard
For interaction with an editor, it will be necessary to identify a good
programming editor with a Python-compatible license, which can be extended
to communicate with the underlying IPython engine.
IDLE, the Tk-based IDE which ships with Python, should obviously be considered.
The Scintilla editing component
\begin_inset Foot
collapsed true
\layout Standard
\begin_inset LatexCommand \htmlurl{http://www.scintilla.org}
\end_inset
\end_inset
may also be a viable candidate.
\layout Standard
It will also be interesting to look at the LyX editor
\begin_inset Foot
collapsed true
\layout Standard
\begin_inset LatexCommand \htmlurl{http://www.lyx.org}
\end_inset
\end_inset
, which already offers a Python client
\begin_inset Foot
collapsed true
\layout Standard
\begin_inset LatexCommand \htmlurl{http://wiki.lyx.org/Tools/PyClient}
\end_inset
\end_inset
.
Since LyX has very sophisticated LaTeX support, this is a very interesting
direction to consider for the future (though LyX makes a poor programming
editor).
\layout Section
Support offered to the students
\layout Standard
The IPython project already has an established Open Source infrastructure,
including CVS repositories, a bug tracker and mailing lists.
As the main author and sole maintainer of IPython, I will personally assist
the student(s) funded with architectural and design guidance, preferably
on the public development mailing list.
I expect them to start working by submitting patches until they show, by
the quality of their work, that they can be granted CVS write access.
I expect most actual implementation work to be done by the students, though
I will provide assistance if they need it with a specific technical issue.
\layout Standard
If more than one applicant is accepted to work on this project, there is
more than enough work to be done which can be coordinated between them.
\layout Section
Licensing and copyright
\layout Standard
IPython is licensed under BSD terms, and copyright of all sources rests
with the original authors of the core modules.
Over the years, all external contributions have been small enough patches
that they have been simply folded into the main source tree without additional
copyright attributions, though explicit credit has always been given to
all contributors.
\layout Standard
I expect the students participating in this project to contribute enough
standalone code that they can retain the copyright to it if they so desire,
as long as they accept all their work to be licensed under BSD terms.
\layout Section
Acknowledgements
\layout Standard
I'd like to thank John D.
Hunter, the author of matplotlib
\begin_inset Foot
collapsed true
\layout Standard
\begin_inset LatexCommand \htmlurl{http://matplotlib.sf.net}
\end_inset
\end_inset
, for lengthy discussions which helped clarify much of this project.
In particular, the important decision of embedding the notebook markup
calls in true Python functions instead of specially-tagged strings or comments
was an idea I thank him for pushing hard enough to convince me of using.
\layout Standard
My conversations with Brian Granger, the author of PyXG
\begin_inset Foot
collapsed true
\layout Standard
\begin_inset LatexCommand \htmlurl{http://hammonds.scu.edu/~classes/pyxg.html}
\end_inset
\end_inset
and braid
\begin_inset Foot
collapsed true
\layout Standard
\begin_inset LatexCommand \htmlurl{http://hammonds.scu.edu/~classes/braid.html}
\end_inset
\end_inset
, have also been very useful in clarifying details of the necessary underlying
infrastructure and future evolution of IPython for this kind of system.
\layout Standard
Thank you also to the IPython users who have, in the past, discussed this
topic with me either in private or on the IPython or Scipy lists.
\the_end