wake-up-neo.com

Wie übergebe ich eine Variable an die Magic Run Funktion in IPython?

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%
69
nadapez

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']
106
minrk

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.

10
David Wolever

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.

1
Emmett Butler