So übergeben Sie eine Variable an die Magic-Run-Funktion in IPython


82

Ich möchte so etwas wie das Folgende tun:

In[1]: name = 'long_name_to_type_every_now_and_then.py'

In[2]: %run name

aber das versucht tatsächlich zu rennen 'name.py', was ich nicht tun möchte.

Gibt es eine allgemeine Möglichkeit, Variablen in Zeichenfolgen umzuwandeln?

So etwas wie das Folgende:

In[3]: %run %name%

Da der Befehl äquivalent zu ist $ python file args, denke ich, ist es nicht möglich.
Ashwini Chaudhary

Antworten:


132

IPython erweitert Variablen im $nameBash-Stil. Dies gilt für alle Magien , nicht nur %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 Zeichenfolgenformatierung können Sie sogar Ausdrücke einfügen {}:

In [3]: args = ["arg1", "arg2"]

In [4]: %run $filename {args[0]} {args[1][-2:]}
['myscript.py', 'arg1', 'g2']

5
Ich wollte nur erwähnen, dass dies auch sehr gut funktioniert, wenn nur beliebige Shell-Befehle mit einem Ausrufezeichen (!) Ausgeführt werden
yoniLavi

@minrk Nur eine einfache Frage, was ist der Unterschied zwischen Variable und Ausdruck. Ist eine Wörterbuchvariable ein Ausdruck? Ich frage, weil ich nach Ihrem Beispiel die ausgefallene Zeichenfolgenformatierung verwenden musste, um das Wörterbuch zu erweitern, aber fehlgeschlagen bin, als ich stattdessen $ verwendet habe. Ich dachte, Listen, Wörterbücher usw. sind alle Variablentypen.
Stephen Jacob

Ich habe das mit %%htmlZellmagie versucht und es hat nicht funktioniert. Gibt es eine andere Syntax für Zellmagie als für Linienmagie?
MROB

Ab der Version 7.3, die einige magicsOpt - out dieser Expansion time, timeit, debugund prun. github.com/ipython/ipython/pull/11516
hpaulj

11

Verwenden Sie get_ipython()diese Option , um einen Verweis auf die aktuelle InteractiveShell abzurufen , und rufen Sie dann die aufmagic() Methode auf:

In [1]: ipy = get_ipython()

In [2]: ipy.magic("run foo.py")
ERROR: File `u'foo.py'` not found.

Bearbeiten Siehe die Antwort von minrk - das ist ein viel besserer Weg, dies zu tun.


1
Dies ist zwar nicht der beste Weg, aber es beantwortete eine andere Frage von mir, wie man ipython magische Befehle in einer Python-Konsole ausführt (wie in, während man Spyder verwendet)
stuppie

1

Es scheint, dass dies mit der eingebauten %runmagischen 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.

# 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 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.


1

Falls das Argument Leerzeichen enthält, z. B. Dateiname, ist es besser, Folgendes zu verwenden:

%run "$filename"
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.