Ich hatte ursprünglich alle meine Module in einem Paket. Ich habe vor kurzem ein Unterpaket im ursprünglichen Paket erstellt und ein paar Module dorthin verschoben. Mein src-Ordner und die 2 Paketordner befinden sich alle in meinem PYTHONPATH.
Seit ich diese Module verlagert habe, scheinen Änderungen, die ich an ihren .py-Dateien vorgenommen habe, nicht in die generierten * $ py.class-Dateien zu gelangen, von denen ich glaube, dass sie letztlich darauf basieren Was print __FILE__
ausspuckt.
Die .class-Dateien befinden sich im Verzeichnis des obersten Pakets, was meiner Meinung nach darauf zurückzuführen ist, dass die erste Stelle, von der sie importiert werden, sich in einem Modul befindet, das sich in diesem Paket befindet. Ich denke, sie sind am richtigen Ort.
Das Zurücksetzen der Module auf das Paket auf oberster Ebene beseitigt zwar das Problem, aber die Notwendigkeit, alle Module in einem Paket zu haben, ist kaum eine Lösung. Muss ich etwas tun, um ein Modul als Teil eines Pakets zu "registrieren", außer es in einem Ordner mit __init__.py
zu haben?
Hinweis: Der Rest dieser Frage betrifft nur die Symptome, die zu dem Schluss geführt haben, dass die .class-Dateien nicht aktualisiert werden, wenn ich die .py-Dateien ändere. Sie können es wahrscheinlich überspringen, wenn Sie eine Art Person sind: P
Ich gebe eine Menge Whitespace am Anfang einer Funktion an, und wenn ich durch sie gehe, folgt der Cursor der Stelle, wo der Code war.
Hier ist der Code, den die IDE mir zeigt:
und hier sind die lokalen vars (beachten Sie, dass self
nichts gebunden hat):
Nachdem ich ein paar Zeilen gemacht habe, ist hier der Code (notiere die Cursorposition): und die Einheimischen:
Beachten Sie, dass self
nun id
und updatePeriod
gebunden hat, also wurden die ersten zwei Codezeilen nach dem Leerzeichen eindeutig ausgeführt.
Wenn ich die .py-Datei vollständig entferne (auf den Desktop kleben oder so), kann die IDE sie natürlich nicht finden, also kann ich nicht durchgehen, aber das Programm läuft auf der Grundlage des Codes, den ich benutzt habe (Es gibt einige offensichtliche Änderungen, die ich nicht sagen kann).
Schließlich sind die Modifikationsdaten in den relevanten * $ py.class-Dateien ungefähr 4,5 Stunden alt, trotz all der Fummelei, die ich mit den letzten .py-Dateien in der letzten Stunde oder 2 gemacht habe.
Kompilierte Python-Dateien werden nicht automatisch entfernt, wenn .py
entfernt wird. Da sie sich in $PYTHONPATH
vor Ihren Unterpaketen befinden, werden sie ausgeführt, und da ihnen keine .py
entsprechen, werden sie verwendet und sie werden nie aktualisiert. Die einzige Lösung besteht darin, sie manuell zu entfernen.
PyDev fügt offensichtlich Verwirrung hinzu, indem es die Quelle tatsächlich interpretiert.
Ich denke, dass es hier zwei Probleme gibt:
$py.class
nicht neu generiert: Dies liegt wahrscheinlich daran, dass Sie die Datei als Haupteintrag ausführen ... Wenn ich mich richtig erinnere, werden die $py.class
nur erzeugt, wenn die Datei importiert wird (dh nicht für Ihr __main__
-Modul) und nur wenn der Code tatsächlich geändert wurde (ich bin mir nicht sicher, wie Jython entscheidet, dass es geändert wurde - wahrscheinlich die Zeit der Datei, aber ich kann hier falsch liegen).
Die beste Lösung dafür wäre, die $ py.class zu löschen, wenn Sie eine Datei und die zugehörige $ py.class verschieben (so wie Sie einen Ordner verschieben), so dass Sie 100% ig sicher sind, dass Jython es niemals aufnehmen wird.
PyDev kann Ihnen dabei helfen: Wählen Sie einen Ordner in PyDev Package Explorer > PyDev > Remove *.pyc, *.pyo and *$py.class Files
.
$py.class
Dateien ohne die entsprechende .py Datei PyDev behandelt das eigentlich korrekt für .pyc-Dateien (d. h. löscht die .pyc, wenn die .py-Datei nicht mehr verfügbar ist). Ich ändere PyDev, um das auch für $py.class
-Dateien zu handhaben (also, wenn du die Nacht innerhalb von 3-4 Stunden bekommst, sollte es funktionieren - siehe: Ссылка für Anweisungen, um es zu bekommen - bis dahin können Sie das Entfernen manuell wie oben beschrieben tun.
Ich hatte die gleiche Frage hier, und ich habe ein paar Tests gemacht.
Ich weiß, dass dieses Thema etwas alt ist, aber ich möchte hier noch etwas hinzufügen.
Die Dateien $py.class
werden nur erstellt und aktualisiert, wenn .py class
importiert wird
irgendwo. Wenn eine .py
-Datei mit execfile()
ausgeführt wird, ist die $py.class
-Datei nicht vorhanden
erstellt oder aktualisiert