This seems to be impossible with the built-in magic function %run . However, your question led me to a rabbit hole, and I wanted to see how easy it would be to do something like that. In the end, it seems pointless to go all out to create another magic function that simply uses execfile() . Maybe this will be something useful for someone, somewhere.
# custom_magics.py from IPython.core.magic import register_line_magic, magics_class, line_magic, Magics @magics_class class StatefulMagics(Magics): def __init__(self, shell, data): super(StatefulMagics, self).__init__(shell) self.namespace = data @line_magic def my_run(self, line): if line[0] != "%": return "Not a variable in namespace" else: filename = self.namespace[line[1:]].split('.')[0] filename += ".py" execfile(filename) return line class Macro(object): def __init__(self, name, value): self.name = name self._value = value ip = get_ipython() magics = StatefulMagics(ip, {name: value}) ip.register_magics(magics) def value(self): return self._value def __repr__(self): return self.name
Using this couple of classes (and given the python script tester.py ), you can create and use the macro variable with the newly created magic function my_run as follows:
In [1]: from custom_magics import Macro In [2]: Macro("somename", "tester.py") Out[2]: somename In [3]: %my_run %somename I'm the test file and I'm running! Out[3]: u'%somename'
Yes, this is a huge and probably wasteful hack. In this vein, I wonder if you can use a name bound to a Macro object as the actual name of the macro. Look at this.
Emmett Butler Jan 19 '13 at 0:55 2013-01-19 00:55
source share