Warum werden meine jython "* $ py.class" -Dateien nicht mit Codeänderungen aktualisiert, nachdem ich sie in ein anderes Paket verschoben habe?

8

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.

    
Cam Jackson 24.08.2011, 04:41
quelle

3 Antworten

4

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.

    
vartec 29.08.2011, 23:27
quelle
1

Ich denke, dass es hier zwei Probleme gibt:

  • Wenn Sie die Datei verschieben, wird $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.

    
Fabio Zadrozny 30.08.2011 11:38
quelle
1

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

    
Tenzin 22.04.2015 06:52
quelle

Tags und Links