Python aktualisieren / neu laden
Dies ist eine sehr grundlegende Frage - aber ich habe nicht in der Lage, eine Antwort zu finden durch die Suche online.
Ich bin mit python zu Steuern, ArcGIS, und ich habe ein einfaches python-Skript, das ruft einige pre-code geschrieben.
Allerdings, wenn ich eine änderung vornehmen, um die bereits geschriebenen code, erscheint es nicht als Ergebnis einer änderung. Ich Importiere das Modul, und haben versucht, erfrischend es ist, aber es passiert nichts.
Ich habe sogar die Datei verschoben ruft er an einen anderen Ort, und das Skript funktioniert immer noch gut. Eine Sache, die ich gestern war, habe ich den Ordner, wo alle meine python-Dateien sind für den sys-Pfad (mithilfe von sys.append('path') ), und ich Frage mich, ob das einen Unterschied gemacht.
Vielen Dank im Voraus, und sorry für die schlampige Terminologie.
InformationsquelleAutor der Frage womble | 2009-10-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist unklar, was du meinst mit "refresh", aber das normale Verhalten von Python ist, dass Sie brauchen, um starten Sie die software für Sie, um einen neuen Blick auf ein Python-Modul und Lesen Sie es.
Wenn Sie Ihre änderungen nicht aufgepasst, auch nach Neustart, dann ist dies aufgrund von zwei Fehlern:
Können Sie mit reload neu-Einlesen einer Datei auch ohne Neustart der software mit dem reload () - Befehl. Beachten Sie, dass alle Variablen zeigen auf etwas im Modul müssen wiedereingeführt, nachdem das Neuladen. So etwas wie dieses:
InformationsquelleAutor der Antwort Lennart Regebro
Einen Weg, dies zu tun ist zu nennen,
neu laden
.Beispiel: Hier ist der Inhalt
foo.py
:In einer interaktiven session, die ich tun kann:
Dann in einem anderen Fenster ändern kann ich
foo.py
:Zurück in die interaktive Sitzung, aufrufen
foo.bar()
noch gibt 1 zurück, bis ich tun:Aufrufen
reload
ist eine Weg, um sicherzustellen, dass Ihr Modul mit up-to-date, auch wenn die Datei auf der Festplatte geändert hat. Es ist nicht unbedingt die effizienteste (Sie könnten besser überprüfen die Zeit der letzten Modifikation auf die Datei oder mit so etwas wie pyinotify, bevor Siereload
), aber es ist sicherlich schnell zu implementieren.Einen Grund dafür, dass Python nicht Lesen aus dem Quell-Modul zu jeder Zeit, dass das laden eines Moduls ist (relativ) teuer-was, wenn Sie hatte eine 300kb-Modul, und Sie wurden nur unter Verwendung einer einzelnen Konstanten aus der Datei? Python lädt ein Modul einmal und behält es im Gedächtnis, bis Sie
reload
.InformationsquelleAutor der Antwort Mark Rushakoff
Ich Folgendes beim importieren Sie alle Objekte aus, die innerhalb eines Moduls zu gewährleisten web2py wurde mit meinem aktuellen code:
InformationsquelleAutor der Antwort Aram Kocharyan
Wenn Sie in ein IPython-shell, dann gibt es einige Magische Befehle, die es gibt.
Den IPython docs decken diese Funktion, den autoreload-Erweiterung.
Ursprünglich fand ich diese Lösung aus Jonathan März das blog-posting auf dieses Thema (siehe Punkt 3 aus diesem link).
Grundsätzlich alles, was Sie tun müssen, ist die folgende, und die änderungen, die Sie vornehmen, spiegeln sich automatisch, nachdem Sie sparen:
InformationsquelleAutor der Antwort Thej Kiran
Ich bin mir nicht wirklich sicher, was du meinst, so zögern Sie nicht, mich zu korrigieren. Sie importieren ein Modul - nennen wir es mymodule.py - in Ihrem Programm, aber wenn Sie den Inhalt ändern, Sie sehen nicht den Unterschied?
Python wird nicht für änderungen im mymodule.py jedes mal, wenn es verwendet wird, wird es laden Sie es ein erstes mal kompilieren zu bytecode und halten es intern. Es wird in der Regel auch speichern Sie den kompilierten bytecode (mymodule.pyc). Das nächste mal, wenn Sie Ihr Programm starten, wird es prüfen, ob mymodule.py ist Aktueller, als mymodule.pyc, und kompilieren Sie es, wenn nötig.
Wenn Sie benötigen, laden Sie das Modul explizit:
Natürlich, es ist komplizierter als das, und Sie haben Nebenwirkungen, je nachdem, was Sie mit Ihrem Programm in Bezug auf das andere Modul, beispielsweise wenn Variablen hängt von Klassen definiert, in mymodule.
Alternativ können Sie die
execfile
Funktion (oderexec()
,eval()
,compile()
)InformationsquelleAutor der Antwort RedGlyph
Ich hatte das exakt gleiche Problem Erstellung eines geoprocessing script für ArcGIS 10.2. Ich hatte eine python-toolbox-Skript, ein tool-Skript und dann ein gemeinsames Skript. Ich habe einen parameter für Dev/Test/Prod in das tool, das steuert, welche version der code ausgeführt wurde. Dev würde führen Sie den code in dev Ordner, testen Sie Sie aus dem Ordner test und prod von prod Ordner. Änderungen an der common-dev Skript nicht ausgeführt wird, wenn das tool ausgeführt wurde von ArcCatalog. Schließen ArcCatalog kein Unterschied gemacht. Obwohl ich ausgewählt habe, Dev-oder Test-es würde immer so laufen, aus der prod Ordner.
Hinzufügen reload(myCommonModule), um die tool-Skript dieses Problem behoben.
InformationsquelleAutor der Antwort Allan Benvin