%PDF- %PDF-
| Direktori : /lib/python3/dist-packages/pythran/ |
| Current File : //lib/python3/dist-packages/pythran/magic.py |
"""
Pythran integration into IPython.
* provides the %%pythran magic function to ipython
"""
# -----------------------------------------------------------------------------
# Copyright (C) 2010-2011, 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.
# -----------------------------------------------------------------------------
import hashlib
import importlib
from IPython.core.magic import Magics, magics_class, cell_magic
from IPython.core import magic_arguments
import pythran
@magics_class
class PythranMagics(Magics):
""" Class to make it possible to use pythran as a magic IPython command."""
def __init__(self, shell):
""" Init the pythran magic stuff. """
super(PythranMagics, self).__init__(shell)
self._reloads = {}
def _import_all(self, module):
""" Import only globals modules. """
self.shell.push({k: v for k, v in module.__dict__.items()
if not k.startswith('__')})
@magic_arguments.magic_arguments()
@magic_arguments.argument('-D', action='append', default=[])
@magic_arguments.argument('-O', action='append', default=[])
@magic_arguments.argument('-m', action='append', default=[])
@magic_arguments.argument('-W', action='append', default=[])
@magic_arguments.argument('-f', action='append', default=[])
@cell_magic
def pythran(self, line, cell):
"""
Compile and import everything from a Pythran code cell.
%%pythran
#pythran export foo(int)
def foo(x):
return x + x
"""
args = magic_arguments.parse_argstring(self.pythran, line)
kwargs = {}
if args.D:
kwargs['define_macros'] = args.D
for v in "OmWf":
args_v = getattr(args, v)
for target in ('extra_compile_args', 'extra_link_args'):
kwargs.setdefault(target, []).extend('-{}{}'.format(v, x)
for x in args_v)
m = hashlib.md5()
m.update(line.encode('utf-8'))
m.update(cell.encode('utf-8'))
module_name = "pythranized_" + m.hexdigest()
module_path = pythran.compile_pythrancode(module_name, cell, **kwargs)
loader = importlib.machinery.ExtensionFileLoader(module_name, module_path)
spec = importlib.machinery.ModuleSpec(name=module_name, loader=loader,
origin=module_path)
module = importlib._bootstrap._load(spec)
self._import_all(module)
def load_ipython_extension(ipython):
"""Load the extension in IPython."""
ipython.register_magics(PythranMagics)