Как передать переменную в функцию magic run в IPython
Я хочу сделать что-то вроде следующего:
In[1]: name = 'long_name_to_type_every_now_and_then.py'
In[2]: %run name
но это на самом деле пытается запустить 'name.py'
, которые не то, что я хочу сделать.
есть ли общий способ превратить переменные в строки?
что-то вроде следующего:
In[3]: %run %name%
3 ответа:
IPython расширяет переменные с помощью
$name
, Баш-стиль. Это верно для всех магий не только%run
.Так вы бы сделали:
In [1]: filename = "myscript.py" In [2]: %run $filename ['myscript.py']
myscript.py содержит:
import sys print(sys.argv)
через причудливое форматирование строки Python, вы даже можете поместить выражения внутри
{}
:In [3]: args = ["arg1", "arg2"] In [4]: %run $filename {args[0]} {args[1][-2:]} ['myscript.py', 'arg1', 'g2']
использовать
get_ipython()
получить ссылку на текущий интерактивная оболочка, затем вызватьmagic()
способ:In [1]: ipy = get_ipython() In [2]: ipy.magic("run foo.py") ERROR: File `u'foo.py'` not found.
Edit посмотреть minrk это - это гораздо лучший способ сделать это.
кажется, это невозможно со встроенным
%run
магические функции. Ваш вопрос привел меня в кроличью нору, хотя, и я хотел посмотреть, как легко было бы сделать что-то подобное. В конце концов, кажется несколько бессмысленным идти на все эти усилия, чтобы создать еще одну магическую функцию, которая просто используетexecfile()
. Может быть, это будет кому-то полезно, где-то.# 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
используя эту пару классов, (и учитывая скрипт 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'
Да, это огромный и, вероятно, расточительный Хак. В этом ключе мне интересно, есть ли способ использовать имя, привязанное к макрообъекту, в качестве фактического имени макроса. Будем разбираться в этом.