Es scheint, dass dies mit der eingebauten %run
magischen Funktion unmöglich ist . Ihre Frage führte mich jedoch in ein Kaninchenloch und ich wollte sehen, wie einfach es wäre, etwas Ähnliches zu tun. Am Ende scheint es etwas sinnlos, all diese Anstrengungen zu unternehmen, um eine weitere magische Funktion zu erschaffen, die nur verwendet wird execfile()
. Vielleicht nützt das jemandem irgendwo etwas.
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
Mit diesem Klassenpaar (und einem Python-Skript tester.py
) ist es möglich, eine "Makro" -Variable mit der neu erstellten "my_run" -Magiefunktion wie folgt zu erstellen und zu verwenden:
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'
Ja, das ist ein riesiger und wahrscheinlich verschwenderischer Hack. In diesem Sinne frage ich mich, ob es eine Möglichkeit gibt, den an das Makroobjekt gebundenen Namen als tatsächlichen Namen des Makros zu verwenden. Werde das untersuchen.
$ python file args
, denke ich, ist es nicht möglich.