Ich möchte Folgendes tun:
In[1]: name = 'long_name_to_type_every_now_and_then.py'
In[2]: %run name
aber das versucht tatsächlich, 'name.py'
, was ich nicht machen möchte.
Gibt es eine allgemeine Möglichkeit, Variablen in Zeichenfolgen umzuwandeln?
So etwas wie das folgende:
In[3]: %run %name%
IPython erweitert Variablen mit $name
Im Bash-Stil. Dies gilt für alle Zauber, nicht nur für %run
.
Also würden Sie tun:
In [1]: filename = "myscript.py"
In [2]: %run $filename
['myscript.py']
myscript.py enthält:
import sys
print(sys.argv)
Über Pythons ausgefallene String-Formatierung können Sie sogar Ausdrücke in {}
Einfügen:
In [3]: args = ["arg1", "arg2"]
In [4]: %run $filename {args[0]} {args[1][-2:]}
['myscript.py', 'arg1', 'g2']
Verwenden Sie get_ipython()
, um einen Verweis auf die aktuelle InteractiveShell abzurufen, und rufen Sie dann die magic()
-Methode auf:
In [1]: ipy = get_ipython()
In [2]: ipy.magic("run foo.py")
ERROR: File `u'foo.py'` not found.
Bearbeiten Siehe Antwort von minrk - das ist ein viel besserer Weg, es zu tun.
Mit der eingebauten magischen Funktion %run
Scheint dies unmöglich zu sein. Ihre Frage führte mich jedoch zu einem Kaninchenbau, und ich wollte sehen, wie einfach es sein würde, etwas Ähnliches zu tun. Am Ende scheint es etwas sinnlos, all diese Anstrengungen zu unternehmen, um eine weitere magische Funktion zu erstellen, die nur execfile()
verwendet. Vielleicht hilft das jemandem irgendwo.
# 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
Mit diesem Klassenpaar (und einem gegebenen python script 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 den tatsächlichen Namen des Makros zu verwenden. Werde das untersuchen.