2016-06-22 11 views
0

Ich schreibe ein Skript und führe es mit dem Argument -i aus, um das Replikat nach dem Ende offen zu halten, damit ich Informationen über die Objekte sehen kann, die ich beim Debuggen verwende.Importieren des aktuellen Pakets

Um zu vermeiden, das Skript zu beenden und neu zu starten, habe ich herausgefunden, dass ich das Skript ändern und speichern kann, und dann [script-name] importieren und dann meine Hauptmethode mit [script-name] aufrufen. Hauptmethode]().

Jetzt möchte ich eine Ein-Zeichen-Methode (der Einfachheit halber) zu schreiben, das tut:

def x(): 
    import [this script] 
    [this script].[main-method]() 

aber auch in der Lage sein, die Skriptdateinamen zu ändern und die einfach Nachladen Funktionalität beibehalten, ohne ändern zu müssen der Code.

Ich habe versucht, mit Importlib (siehe unten) ohne Erfolg.

def y(): 
    import importlib 
    this = importlib.import_module("".join(sys.argv[0].split(".py"))) # sys.argv[0] gives [module-name].py and the rest of the code inside the parentheses removes the ".py" 
    this.[main-method]() 

Antwort

1

import, in irgendetwas davon ist Inkarnationen, nur das Skript einmal neu lädt. Sie suchen die reload Funktion:

from importlib import reload 
import sys 

def main(): 
    pass 

def x(): 
    reload(sys.modules[__name__]) 
    main() 

Dieser Code das Modul neu geladen werden Sie sich gerade befinden (wahrscheinlich __main__) und ein Verfahren davon erneut ausführen. Wenn Sie einen Skript aus dem Interpreter neu laden wollen, gehen Sie wie folgt statt:

>>> from importlib import reload 
>>> def x(): 
...  reload(mymodule) 
...  mymodule.main() 
... 
>>> import mymodule 
>>> mymodule.main() 
>>> # Do some stuff with mymodule 
>>> x() 

Sie haben import mymodule mit mymodule = importlib.import_module("".join(sys.argv[0].split(".py"))) zu ersetzen, wenn das Skript in einer seltsamen Lage ist.

Quellen:

+0

Das gibt mir "ImportError: Interne Modul __main__ kann nicht neu initialisiert werden". Könnte das Hauptmodul die einzige Ausnahme sein? – PistoletPierre

+0

Ja. Versuchen Sie dies nicht über die Befehlszeile. \ _ \ _ main \ _ \ _ ist das "Modul", das alle von Ihnen eingegebenen Daten enthält. Es macht Sinn, dass Sie das nicht neu laden können. –

+0

Fun Tatsache, Sie können Backslashes vor jedem Unterstrich verwenden, um seine besondere Bedeutung zu entfernen. Versuchen Sie Folgendes: \\ _ \\ _ main \\ _ \\ _ –

0

ich habe es geschafft!

def x(): # make what I'm doing now at this very moment easier 
    main() 
    print("It works!") 

def y(): # calls x() after loading most recent version 
    import importlib 
    from imp import reload 
    this = importlib.import_module("".join(sys.argv[0].split(".py"))) # sys.argv gives [module-name].py and the rest of the code inside the brackets removes the ".py" 
    this = reload(this) 
    this.x() 
+0

'this = importlib.import_module' muss nur einmal ausgeführt werden. Machen Sie 'this' zu einem globalen Befehl und laden Sie dann' this = reload (this) 'neu. Auch 'this.main()'. –

+0

Got it - danke @MadPhysicist – PistoletPierre

+0

FYI, 'imp' ist, aus welchen Gründen auch immer, ab 3.4 veraltet. Aber viele seiner Methoden existieren in 'importlib', einschließlich' reload', also ab 3.4 können Sie einfach 'importlib' importieren, um' import_module' und 'reload' zu erhalten. – ShadowRanger

Verwandte Themen