Parece que esto es imposible con la %runfunción mágica incorporada. Sin embargo, tu pregunta me llevó a la madriguera de un conejo y quería ver qué tan fácil sería hacer algo similar. Al final, parece un tanto inútil hacer todo este esfuerzo para crear otra función mágica que acaba de usar execfile(). Quizás esto sea de alguna utilidad para alguien, en algún lugar.
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
Usando este par de clases, (y dado un script de Python tester.py) es posible crear y usar una variable "macro" con la función mágica "my_run" recién creada así:
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'
Sí, este es un truco enorme y probablemente derrochador. En ese sentido, me pregunto si hay una manera de que el nombre vinculado al objeto Macro se use como el nombre real de la macro. Lo investigaremos.
$ python file args, supongo que no es posible.