From c0a291db5f50443864585370a62609d1c569bb16 Mon Sep 17 00:00:00 2001 From: tdd20 Date: Tue, 8 Sep 2015 13:17:29 +0100 Subject: [PATCH] Version 0.3.0 depends on split Jupyter package --- README.rst | 36 ++++++++++++++++++++++++++++-------- doc/kernels.png | Bin 0 -> 13247 bytes remote_ikernel/__init__.py | 2 +- setup.py | 4 ++-- 4 files changed, 31 insertions(+), 11 deletions(-) create mode 100644 doc/kernels.png diff --git a/README.rst b/README.rst index fc408bc..5ba1845 100644 --- a/README.rst +++ b/README.rst @@ -1,19 +1,33 @@ Remote IKernel -------------- -Launch IPython/Jupyter kernels on remote systems so that they can be +Launch Jupyter kernels on remote systems so that they can be used with local noteboooks. -Kernels start through interactive jobs in batch queue systems (only SGE -and SLURM at the moment) or through SSH connections. Once the kernel is +..image :: https://bitbucket.org/tdaff/remote_ikernel/raw/default/doc/kernels.png + +Kernels start through interactive jobs in batch queue systems (SGE, SLURM, +PBS...) or through SSH connections. Once the kernel is started, SSH tunnels are created for the communication ports are so the notebook can talk to the kernel as if it was local. -Commands for managing the kernels are included. +Commands for managing the kernels are included. There are also options for +managing kernels from different virtual environments or different python +implementations. + +Install with ``pip install remote_ikernel``. Requires ``notebook`` (as part +of jupyter), version 4.0 or greater and ``pexpect``. Passwordless ``ssh`` +to the remote machines is also required. + +.. note:: + + Version 0.3 of this package depends on the split Jupyter and IPython + version 4 and later when installing with pip. If you are upgrading + from an older version of IPython, Jupyter will probably migrate your + existing kernels (to `~/.local/share/jupyter/kernels/`), but not + profiles. If you need to stick with IPython 3 series, use an older + version of `remote_ikernel` or install without using pip/setuptools. -Install with ``pip install remote_ikernel``. Requires ``IPython`` version -3.0 or greater and ``pexpect``. Passwordless ``ssh`` to the remote machines -is also required. .. code:: shell @@ -46,7 +60,7 @@ is also required. .. code:: shell - # Set up kernels for all your local virtual environments that can be run + # Set up kernels for your local virtual environments that can be run # from a single notebook server. remote_ikernel manage --add \ @@ -64,6 +78,12 @@ the drop-down list in the notebook. calls ``run(`kill $(getpid())`)`` instaed of ``exit()``. +Changes for v0.3 +================ + + * Updated pip requirements to pull in the `notebook` package. Use an earlier + version if you need to use IPython 3. + Changes for v0.2 ================ diff --git a/doc/kernels.png b/doc/kernels.png new file mode 100644 index 0000000000000000000000000000000000000000..6478903247cef7b49b947bc223f7bb1ae7ee8eae GIT binary patch literal 13247 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 literal 0 HcmV?d00001 diff --git a/remote_ikernel/__init__.py b/remote_ikernel/__init__.py index a362112..5d70c41 100644 --- a/remote_ikernel/__init__.py +++ b/remote_ikernel/__init__.py @@ -5,5 +5,5 @@ """ -__version__ = '0.2.11' +__version__ = '0.3.0' RIK_PREFIX = 'rik_' diff --git a/setup.py b/setup.py index 1b063e7..5ad6923 100644 --- a/setup.py +++ b/setup.py @@ -6,7 +6,7 @@ from distutils.core import setup setup(name='remote_ikernel', - version='0.2.11', + version='0.3.0', description='Running IPython kernels through batch queues', long_description=open('README.rst').read(), author='Tom Daff', @@ -15,7 +15,7 @@ url='https://bitbucket.org/tdaff/remote_ikernel', packages=['remote_ikernel'], scripts=['bin/remote_ikernel'], - install_requires=['ipython[notebook]<4', 'pexpect', 'tornado'], + install_requires=['notebook', 'pexpect', 'tornado'], classifiers=[ 'Programming Language :: Python :: 2', 'Programming Language :: Python :: 3',