htmlnotebook.txt
417 lines
| 17.8 KiB
| text/plain
|
TextLexer
Brian E. Granger
|
r4524 | .. _htmlnotebook: | ||
========================= | ||||
An HTML Notebook IPython | ||||
========================= | ||||
MinRK
|
r4856 | .. seealso:: | ||
:ref:`Installation requirements <installnotebook>` for the Notebook. | ||||
Brian E. Granger
|
r4524 | The IPython Notebook consists of two related components: | ||
Brian E. Granger
|
r4674 | * An JSON based Notebook document format for recording and distributing | ||
Brian E. Granger
|
r4524 | Python code and rich text. | ||
* A web-based user interface for authoring and running notebook documents. | ||||
The Notebook can be used by starting the Notebook server with the | ||||
command:: | ||||
$ ipython notebook | ||||
Fernando Perez
|
r4671 | Note that by default, the notebook doesn't load pylab, it's just a normal | ||
IPython session like any other. If you want pylab support, you must use:: | ||||
$ ipython notebook --pylab | ||||
which will behave similar to the terminal and Qt console versions, using your | ||||
default matplotlib backend and providing floating interactive plot windows. If | ||||
you want inline figures, you must manually select the ``inline`` backend:: | ||||
Fernando Perez
|
r5494 | $ ipython notebook --pylab inline | ||
Fernando Perez
|
r4671 | |||
Brian E. Granger
|
r4524 | This server uses the same ZeroMQ-based two process kernel architecture as | ||
Satrajit Ghosh
|
r4681 | the QT Console as well Tornado for serving HTTP/S requests. Some of the main | ||
Brian E. Granger
|
r4524 | features of the Notebook include: | ||
* Display rich data (png/html/latex/svg) in the browser as a result of | ||||
computations. | ||||
* Compose text cells using HTML and Markdown. | ||||
Brian E. Granger
|
r4674 | * Import and export notebook documents in range of formats (.ipynb, .py). | ||
Brian E. Granger
|
r4524 | * In browser syntax highlighting, tab completion and autoindentation. | ||
* Inline matplotlib plots that can be stored in Notebook documents and opened | ||||
later. | ||||
See :ref:`our installation documentation <install_index>` for directions on | ||||
how to install the notebook and its dependencies. | ||||
Fernando Perez
|
r4671 | .. note:: | ||
You can start more than one notebook server at the same time, if you want to | ||||
work on notebooks in different directories. By default the first notebook | ||||
server starts in port 8888, later notebooks search for random ports near | ||||
that one. You can also manually specify the port with the ``--port`` | ||||
Brian E. Granger
|
r4674 | option. | ||
Fernando Perez
|
r4671 | |||
Brian E. Granger
|
r4524 | Basic Usage | ||
=========== | ||||
Fernando Perez
|
r4671 | The landing page of the notebook server application, which we call the IPython | ||
Notebook *dashboard*, shows the notebooks currently available in the directory | ||||
in which the application was started, and allows you to create new notebooks. | ||||
A notebook is a combination of two things: | ||||
Brian E. Granger
|
r4674 | 1. An interactive session connected to an IPython kernel, controlled by a web | ||
Fernando Perez
|
r5494 | application that can send input to the console and display many types of | ||
output (text, graphics, mathematics and more). This is the same kernel used | ||||
by the :ref:`Qt console <qtconsole>`, but in this case the web console sends | ||||
input in persistent cells that you can edit in-place instead of the | ||||
vertically scrolling terminal style used by the Qt console. | ||||
Fernando Perez
|
r4671 | |||
Brian E. Granger
|
r4674 | 2. A document that can save the inputs and outputs of the session as well as | ||
Fernando Perez
|
r5494 | additional text that accompanies the code but is not meant for execution. | ||
In this way, notebook files serve as a complete computational record of a | ||||
session including explanatory text and mathematics, code and resulting | ||||
figures. These documents are internally JSON files and are saved with the | ||||
``.ipynb`` extension. | ||||
Fernando Perez
|
r4671 | |||
If you have ever used the Mathematica or Sage notebooks (the latter is also | ||||
web-based__) you should feel right at home. If you have not, you should be | ||||
able to learn how to use it in just a few minutes. | ||||
.. __: http://sagenb.org | ||||
Creating and editing notebooks | ||||
------------------------------ | ||||
You can create new notebooks from the dashboard with the ``New Notebook`` | ||||
button or open existing ones by clicking on their name. Once in a notebook, | ||||
your browser tab will reflect the name of that notebook (prefixed with "IPy:"). | ||||
Brian E. Granger
|
r4674 | The URL for that notebook is not meant to be human-readable and is *not* | ||
persistent across invocations of the notebook server. | ||||
Fernando Perez
|
r4671 | |||
Brian E. Granger
|
r4674 | You can also drag and drop into the area listing files any python file: it | ||
Fernando Perez
|
r4671 | will be imported into a notebook with the same name (but ``.ipynb`` extension) | ||
located in the directory where the notebook server was started. This notebook | ||||
will consist of a single cell with all the code in the file, which you can | ||||
later manually partition into individual cells for gradual execution, add text | ||||
and graphics, etc. | ||||
Fernando Perez
|
r5494 | |||
Fernando Perez
|
r4671 | Workflow and limitations | ||
------------------------ | ||||
The normal workflow in a notebook is quite similar to a normal IPython session, | ||||
with the difference that you can edit a cell in-place multiple times until you | ||||
obtain the desired results rather than having to rerun separate scripts with | ||||
the ``%run`` magic (though magics also work in the notebook). Typically | ||||
you'll work on a problem in pieces, organizing related pieces into cells and | ||||
moving forward as previous parts work correctly. This is much more convenient | ||||
for interactive exploration than breaking up a computation into scripts that | ||||
must be executed together, especially if parts of them take a long time to run | ||||
Paul Ivanov
|
r4880 | (In the traditional terminal-based IPython, you can use tricks with namespaces | ||
and ``%run -i`` to achieve this capability, but we think the notebook is a more | ||||
natural solution for that kind of problem). | ||||
Fernando Perez
|
r4671 | |||
The only significant limitation the notebook currently has, compared to the qt | ||||
console, is that it can not run any code that expects input from the kernel | ||||
(such as scripts that call :func:`raw_input`). Very importantly, this means | ||||
that the ``%debug`` magic does *not* work in the notebook! We intend to | ||||
correct this limitation, but in the meantime, there is a way to debug problems | ||||
in the notebook: you can attach a Qt console to your existing notebook kernel, | ||||
Fernando Perez
|
r5014 | and run ``%debug`` from the Qt console. If your notebook is running on a local | ||
computer (i.e. if you are accessing it via your localhost address at | ||||
127.0.0.1), you can just type ``%qtconsole`` in the notebook and a Qt console | ||||
will open up connected to that same kernel. | ||||
In general, the notebook server prints the full details of how to connect to | ||||
Thomas Kluyver
|
r5444 | each kernel at the terminal, with lines like:: | ||
Fernando Perez
|
r4671 | |||
[IPKernelApp] To connect another client to this kernel, use: | ||||
Fernando Perez
|
r5014 | [IPKernelApp] --existing kernel-3bb93edd-6b5a-455c-99c8-3b658f45dde5.json | ||
This is the name of a JSON file that contains all the port and validation | ||||
information necessary to connect to the kernel. You can manually start a | ||||
qt console with:: | ||||
ipython qtconsole --existing kernel-3bb93edd-6b5a-455c-99c8-3b658f45dde5.json | ||||
and if you only have a single kernel running, simply typing:: | ||||
Fernando Perez
|
r4671 | |||
Fernando Perez
|
r5014 | ipython qtconsole --existing | ||
Fernando Perez
|
r4671 | |||
Fernando Perez
|
r5014 | will automatically find it (it will always find the most recently started | ||
kernel if there is more than one). You can also request this connection data | ||||
by typing ``%connect_info``; this will print the same file information as well | ||||
as the content of the JSON data structure it contains. | ||||
Fernando Perez
|
r4671 | |||
Text input | ||||
---------- | ||||
Paul Ivanov
|
r4880 | In addition to code cells and the output they produce (such as figures), you | ||
Fernando Perez
|
r4671 | can also type text not meant for execution. To type text, change the type of a | ||
Brian E. Granger
|
r4674 | cell from ``Code`` to ``Markdown`` by using the button or the :kbd:`Ctrl-m m` | ||
Fernando Perez
|
r4671 | keybinding (see below). You can then type any text in Markdown_ syntax, as | ||
well as mathematical expressions if you use ``$...$`` for inline math or | ||||
``$$...$$`` for displayed math. | ||||
Fernando Perez
|
r5494 | |||
Exporting a notebook and importing existing scripts | ||||
--------------------------------------------------- | ||||
Fernando Perez
|
r4671 | |||
If you want to provide others with a static HTML or PDF view of your notebook, | ||||
use the ``Print`` button. This opens a static view of the document, which you | ||||
can print to PDF using your operating system's facilities, or save to a file | ||||
with your web browser's 'Save' option (note that typically, this will create | ||||
both an html file *and* a directory called `notebook_name_files` next to it | ||||
that contains all the necessary style information, so if you intend to share | ||||
this, you must send the directory along with the main html file). | ||||
The `Download` button lets you save a notebook file to the Download area | ||||
configured by your web browser (particularly useful if you are running the | ||||
notebook server on a remote host and need a file locally). The notebook is | ||||
saved by default with the ``.ipynb`` extension and the files contain JSON data | ||||
that is not meant for human editing or consumption. But you can always export | ||||
the input part of a notebook to a plain python script by choosing Python format | ||||
in the `Download` drop list. This removes all output and saves the text cells | ||||
Fernando Perez
|
r5494 | in comment areas. See ref:`below <notebook_format>` for more details on the | ||
notebook format. | ||||
The notebook can also *import* ``.py`` files as notebooks, by dragging and | ||||
dropping the file into the notebook dashboard file list area. By default, the | ||||
entire contents of the file will be loaded into a single code cell. But if | ||||
prior to import, you manually add the ``# <nbformat>2</nbformat>`` marker at | ||||
the start and then add separators for text/code cells, you can get a cleaner | ||||
import with the file broken into individual cells. | ||||
Fernando Perez
|
r5759 | |||
Fernando Perez
|
r4671 | .. warning:: | ||
While in simple cases you can roundtrip a notebook to Python, edit the | ||||
Fernando Perez
|
r5494 | python file and import it back without loss of main content, this is in | ||
general *not guaranteed to work at all*. First, there is extra metadata | ||||
saved in the notebook that may not be saved to the ``.py`` format. And as | ||||
the notebook format evolves in complexity, there will be attributes of the | ||||
notebook that will not survive a roundtrip through the Python form. You | ||||
should think of the Python format as a way to output a script version of a | ||||
notebook and the import capabilities as a way to load existing code to get a | ||||
notebook started. But the Python version is *not* an alternate notebook | ||||
format. | ||||
Fernando Perez
|
r4671 | |||
Fernando Perez
|
r5759 | |||
Importing or executing a notebook as a normal Python file | ||||
--------------------------------------------------------- | ||||
The native format of the notebook, a file with a ``.ipynb`` extension, is a | ||||
JSON container of all the input and output of the notebook, and therefore not | ||||
valid Python by itself. This means that by default, you can not import a | ||||
notebook or execute it as a normal python script. But if you want use | ||||
notebooks as regular Python files, you can start the notebook server with:: | ||||
ipython notebook --script | ||||
or you can set this option permanently in your configuration file with:: | ||||
c.NotebookManager.save_script=True | ||||
This will instruct the notebook server to save the ``.py`` export of each | ||||
notebook adjacent to the ``.ipynb`` at every save. These files can be | ||||
``%run``, imported from regular IPython sessions or other notebooks, or | ||||
executed at the command-line as normal Python files. Since we export the raw | ||||
code you have typed, for these files to be importable from other code you will | ||||
have to avoid using syntax such as ``%magics`` and other IPython-specific | ||||
extensions to the language. | ||||
In regular practice, the standard way to differentiate importable code from the | ||||
'executable' part of a script is to put at the bottom:: | ||||
if __name__ == '__main__': | ||||
# rest of the code... | ||||
Since all cells in the notebook are run as top-level code, you'll need to | ||||
similarly protect *all* cells that you do not want executed when other scripts | ||||
try to import your notebook. A convenient shortand for this is to define early | ||||
on:: | ||||
script = __name__ == '__main__': | ||||
and then on any cell that you need to protect, use:: | ||||
if script: | ||||
# rest of the cell... | ||||
Fernando Perez
|
r4671 | |||
Keyboard use | ||||
------------ | ||||
All actions in the notebook can be achieved with the mouse, but we have also | ||||
added keyboard shortcuts for the most common ones, so that productive use of | ||||
the notebook can be achieved with minimal mouse intervention. The main | ||||
key bindings you need to remember are: | ||||
* :kbd:`Shift-Enter`: execute the current cell (similar to the Qt console), | ||||
show output (if any) and create a new cell below. Note that in the notebook, | ||||
simply using :kbd:`Enter` *never* forces execution, it simply inserts a new | ||||
line in the current cell. Therefore, in the notebook you must always use | ||||
:kbd:`Shift-Enter` to get execution (or use the mouse and click on the ``Run | ||||
Selected`` button). | ||||
Brian E. Granger
|
r4674 | * :kbd:`Ctrl-Enter`: execute the current cell in "terminal mode", where any | ||
Paul Ivanov
|
r4880 | output is shown but the cursor stays in the current cell, whose input | ||
Fernando Perez
|
r4671 | area is flushed empty. This is convenient to do quick in-place experiments | ||
or query things like filesystem content without creating additional cells you | ||||
may not want saved in your notebook. | ||||
Brian E. Granger
|
r4674 | * :kbd:`Ctrl-m`: this is the prefix for all other keybindings, which consist | ||
Fernando Perez
|
r4671 | of an additional single letter. Type :kbd:`Ctrl-m h` (that is, the sole | ||
letter :kbd:`h` after :kbd:`Ctrl-m`) and IPython will show you the remaining | ||||
available keybindings. | ||||
Fernando Perez
|
r5494 | |||
.. _notebook_security: | ||||
MinRK
|
r5152 | Security | ||
======== | ||||
Thomas Kluyver
|
r5445 | You can protect your notebook server with a simple single-password by | ||
setting the :attr:`NotebookApp.password` configurable. You can prepare a | ||||
hashed password using the function :func:`IPython.lib.security.passwd`: | ||||
MinRK
|
r5152 | |||
Thomas Kluyver
|
r5445 | .. sourcecode:: ipython | ||
In [1]: from IPython.lib import passwd | ||||
In [2]: passwd() | ||||
Enter password: | ||||
Verify password: | ||||
Out[2]: 'sha1:67c9e60bb8b6:9ffede0825894254b2e042ea597d771089e11aed' | ||||
.. note:: | ||||
MinRK
|
r5152 | |||
Thomas Kluyver
|
r5445 | :func:`~IPython.lib.security.passwd` can also take the password as a string | ||
argument. **Do not** pass it as an argument inside an IPython session, as it | ||||
will be saved in your input history. | ||||
You can then add this to your :file:`ipython_notebook_config.py`, e.g.:: | ||||
# Password to use for web authentication | ||||
c.NotebookApp.password = u'sha1:67c9e60bb8b6:9ffede0825894254b2e042ea597d771089e11aed' | ||||
MinRK
|
r5152 | |||
When using a password, it is a good idea to also use SSL, so that your password | ||||
Fernando Perez
|
r5516 | is not sent unencrypted by your browser. You can start the notebook to | ||
Fernando Perez
|
r5494 | communicate via a secure protocol mode using a self-signed certificate by | ||
typing:: | ||||
MinRK
|
r5152 | |||
$ ipython notebook --certfile=mycert.pem | ||||
.. note:: | ||||
Fernando Perez
|
r5494 | A self-signed certificate can be generated with openssl. For example, the | ||
following command will create a certificate valid for 365 days with both | ||||
the key and certificate data written to the same file:: | ||||
MinRK
|
r5152 | |||
$ openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout mycert.pem -out mycert.pem | ||||
Fernando Perez
|
r5494 | Your browser will warn you of a dangerous certificate because it is | ||
self-signed. If you want to have a fully compliant certificate that will not | ||||
raise warnings, it is possible (but rather involved) to obtain one for free, | ||||
`as explained in detailed in this tutorial`__. | ||||
.. __: http://arstechnica.com/security/news/2009/12/how-to-get-set-with-a-secure-sertificate-for-free.ars | ||||
Keep in mind that when you enable SSL support, you'll need to access the | ||||
notebook server over ``https://``, not over plain ``http://``. The startup | ||||
message from the server prints this, but it's easy to overlook and think the | ||||
server is for some reason non-responsive. | ||||
Quick Howto: running a public notebook server | ||||
============================================= | ||||
If you want to access your notebook server remotely with just a web browser, | ||||
here is a quick set of instructions. Start by creating a certificate file and | ||||
a hashed password as explained above. Then, create a custom profile for the | ||||
notebook. At the command line, type:: | ||||
ipython profile create nbserver | ||||
In the profile directory, edit the file ``ipython_notebook_config.py``. By | ||||
default the file has all fields commented, the minimum set you need to | ||||
uncomment and edit is here:: | ||||
c = get_config() | ||||
# Kernel config | ||||
c.IPKernelApp.pylab = 'inline' # if you want plotting support always | ||||
# Notebook config | ||||
c.NotebookApp.certfile = u'/absolute/path/to/your/certificate/mycert.pem' | ||||
c.NotebookApp.ip = '*' | ||||
c.NotebookApp.open_browser = False | ||||
c.NotebookApp.password = u'sha1:bcd259ccf...your hashed password here' | ||||
# It's a good idea to put it on a known, fixed port | ||||
c.NotebookApp.port = 9999 | ||||
You can then start the notebook and access it later by pointing your browser to | ||||
``https://your.host.com:9999``. | ||||
.. _notebook_format: | ||||
The notebook format | ||||
=================== | ||||
The notebooks themselves are JSON files with an ``ipynb`` extension, formatted | ||||
as legibly as possible with minimal extra indentation and cell content broken | ||||
across lines to make them reasonably friendly to use in version-control | ||||
workflows. You should be very careful if you ever edit manually this JSON | ||||
data, as it is extremely easy to corrupt its internal structure and make the | ||||
file impossible to load. In general, you should consider the notebook as a | ||||
file meant only to be edited by IPython itself, not for hand-editing. | ||||
.. note:: | ||||
Binary data such as figures are directly saved in the JSON file. This | ||||
provides convenient single-file portability but means the files can be | ||||
large and diffs of binary data aren't very meaningful. Since the binary | ||||
blobs are encoded in a single line they only affect one line of the diff | ||||
output, but they are typically very long lines. You can use the | ||||
'ClearAll' button to remove all output from a notebook prior to | ||||
committing it to version control, if this is a concern. | ||||
The notebook server can also generate a pure-python version of your notebook, | ||||
by clicking on the 'Download' button and selecting ``py`` as the format. This | ||||
file will contain all the code cells from your notebook verbatim, and all text | ||||
cells prepended with a comment marker. The separation between code and text | ||||
cells is indicated with special comments and there is a header indicating the | ||||
format version. All output is stripped out when exporting to python. | ||||
Here is an example of a simple notebook with one text cell and one code input | ||||
cell, when exported to python format:: | ||||
# <nbformat>2</nbformat> | ||||
# <markdowncell> | ||||
# A text cell | ||||
# <codecell> | ||||
print "hello IPython" | ||||
Thomas Kluyver
|
r5481 | Known Issues | ||
============ | ||||
When behind a proxy, especially if your system or browser is set to autodetect | ||||
the proxy, the html notebook might fail to connect to the server's websockets, | ||||
and present you with a warning at startup. In this case, you need to configure | ||||
your system not to use the proxy for the server's address. | ||||
In Firefox, for example, go to the Preferences panel, Advanced section, | ||||
Network tab, click 'Settings...', and add the address of the notebook server | ||||
to the 'No proxy for' field. | ||||
Fernando Perez
|
r4671 | |||
Fernando Perez
|
r5494 | |||
Thomas Kluyver
|
r5444 | .. _Markdown: http://daringfireball.net/projects/markdown/basics | ||