Здається, це неможливо завдяки вбудованій %runмагічній функції. Твоє запитання, однак, привело мене до кролячої нори, і я хотів побачити, як легко було б зробити щось подібне. Зрештою, здається дещо безглуздим іти на всі ці зусилля, щоб створити ще одну магічну функцію, яка просто використовується execfile(). Можливо, це комусь десь буде корисно.
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
Використовуючи цю пару класів (та з урахуванням сценарію python tester.py), можна створити та використовувати змінну "макрос" із новоствореною магічною функцією "my_run" приблизно так:
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'
Так, це величезний і, мабуть, марнотратний хак. У цьому ключі мені цікаво, чи є спосіб, щоб ім’я, прив’язане до об’єкта Макрос, використовувалось як дійсне ім’я макросу. Будемо розбиратися в цьому.
$ python file args, то, я думаю, це неможливо.