extension.py
96 lines
| 3.6 KiB
| text/x-python
|
PythonLexer
Fernando Perez
|
r6967 | """Implementation of magic functions for the extension machinery. | ||
""" | ||||
Thomas Kluyver
|
r13348 | from __future__ import print_function | ||
Fernando Perez
|
r6967 | #----------------------------------------------------------------------------- | ||
# Copyright (c) 2012 The IPython Development Team. | ||||
# | ||||
# Distributed under the terms of the Modified BSD License. | ||||
# | ||||
# The full license is in the file COPYING.txt, distributed with this software. | ||||
#----------------------------------------------------------------------------- | ||||
#----------------------------------------------------------------------------- | ||||
# Imports | ||||
#----------------------------------------------------------------------------- | ||||
# Stdlib | ||||
import os | ||||
# Our own packages | ||||
Bradley M. Froehle
|
r8278 | from IPython.core.error import UsageError | ||
Fernando Perez
|
r6973 | from IPython.core.magic import Magics, magics_class, line_magic | ||
Matthias Bussonnier
|
r21514 | from warnings import warn | ||
Fernando Perez
|
r6967 | |||
#----------------------------------------------------------------------------- | ||||
# Magic implementation classes | ||||
#----------------------------------------------------------------------------- | ||||
Fernando Perez
|
r6973 | @magics_class | ||
Fernando Perez
|
r6967 | class ExtensionMagics(Magics): | ||
"""Magics to manage the IPython extensions system.""" | ||||
@line_magic | ||||
def install_ext(self, parameter_s=''): | ||||
"""Download and install an extension from a URL, e.g.:: | ||||
%install_ext https://bitbucket.org/birkenfeld/ipython-physics/raw/d1310a2ab15d/physics.py | ||||
The URL should point to an importable Python module - either a .py file | ||||
or a .zip file. | ||||
Parameters: | ||||
-n filename : Specify a name for the file, rather than taking it from | ||||
the URL. | ||||
""" | ||||
Aaron Meurer
|
r21607 | warn("%install_ext` is deprecated, please distribute your extension " | ||
"as a python package.", UserWarning) | ||||
Fernando Perez
|
r6967 | opts, args = self.parse_options(parameter_s, 'n:') | ||
try: | ||||
filename = self.shell.extension_manager.install_extension(args, | ||||
opts.get('n')) | ||||
except ValueError as e: | ||||
Thomas Kluyver
|
r13348 | print(e) | ||
Fernando Perez
|
r6967 | return | ||
filename = os.path.basename(filename) | ||||
Thomas Kluyver
|
r13348 | print("Installed %s. To use it, type:" % filename) | ||
print(" %%load_ext %s" % os.path.splitext(filename)[0]) | ||||
Fernando Perez
|
r6967 | |||
@line_magic | ||||
def load_ext(self, module_str): | ||||
"""Load an IPython extension by its module name.""" | ||||
Bradley M. Froehle
|
r8278 | if not module_str: | ||
raise UsageError('Missing module name.') | ||||
Thomas Kluyver
|
r8586 | res = self.shell.extension_manager.load_extension(module_str) | ||
if res == 'already loaded': | ||||
Thomas Kluyver
|
r13348 | print("The %s extension is already loaded. To reload it, use:" % module_str) | ||
print(" %reload_ext", module_str) | ||||
Thomas Kluyver
|
r8586 | elif res == 'no load function': | ||
Thomas Kluyver
|
r13348 | print("The %s module is not an IPython extension." % module_str) | ||
Fernando Perez
|
r6967 | |||
@line_magic | ||||
def unload_ext(self, module_str): | ||||
Thomas Kluyver
|
r8549 | """Unload an IPython extension by its module name. | ||
Not all extensions can be unloaded, only those which define an | ||||
``unload_ipython_extension`` function. | ||||
""" | ||||
Bradley M. Froehle
|
r8278 | if not module_str: | ||
raise UsageError('Missing module name.') | ||||
Thomas Kluyver
|
r8549 | |||
res = self.shell.extension_manager.unload_extension(module_str) | ||||
if res == 'no unload function': | ||||
Thomas Kluyver
|
r13348 | print("The %s extension doesn't define how to unload it." % module_str) | ||
Thomas Kluyver
|
r8549 | elif res == "not loaded": | ||
Thomas Kluyver
|
r13348 | print("The %s extension is not loaded." % module_str) | ||
Fernando Perez
|
r6967 | |||
@line_magic | ||||
def reload_ext(self, module_str): | ||||
"""Reload an IPython extension by its module name.""" | ||||
Bradley M. Froehle
|
r8278 | if not module_str: | ||
raise UsageError('Missing module name.') | ||||
Fernando Perez
|
r6967 | self.shell.extension_manager.reload_extension(module_str) | ||