Macro / script / Compilieren
Macro / script / Compilieren
Hallo,
ich arbeite viel mit scripts.
Dazu rufe ich aus einem Macro eine .py (selbstgeschrieben) auf.
mein Halbwissen:
FreeCAD erstellt (compiliert?) nun im __pycache__ eine .pyc - Datei, behält sie aber auch im cash.
Ich ändere (teste) nun viel in meinen .py - Dateien
Ich lösche dann die .pyc und starte FreeCAD neu, damit FreeCAD die .pyc neu erstellt
Das finde ich ein bischen nervig.
Kann ich irgendwo einstellen, dass die .pyc beim Aufruf der Macro-Datei neu erstellt werden? ( am besten wenn die .pyc älter als die .py ist)
Gruß Rainer
ich arbeite viel mit scripts.
Dazu rufe ich aus einem Macro eine .py (selbstgeschrieben) auf.
mein Halbwissen:
FreeCAD erstellt (compiliert?) nun im __pycache__ eine .pyc - Datei, behält sie aber auch im cash.
Ich ändere (teste) nun viel in meinen .py - Dateien
Ich lösche dann die .pyc und starte FreeCAD neu, damit FreeCAD die .pyc neu erstellt
Das finde ich ein bischen nervig.
Kann ich irgendwo einstellen, dass die .pyc beim Aufruf der Macro-Datei neu erstellt werden? ( am besten wenn die .pyc älter als die .py ist)
Gruß Rainer
Re: Macro / script / Compilieren
Hast Du mal probiert, ob das überhaupt nötig ist? Ich glaube, dass Python das selbst schon an Hand des Zeitstempels richtig macht.
A Sketcher Lecture with in-depth information is available in English, auf Deutsch, en français, en español.
Re: Macro / script / Compilieren
Stimmt! man braucht die .pyc nicht löschen, ich muss FreeCAD aber neu starten.
.. und das ist beim Testen das Nervige.
kann ich per script das Compilieren einer .py veranlassen?
.. und das ist beim Testen das Nervige.
kann ich per script das Compilieren einer .py veranlassen?
Re: Macro / script / Compilieren
Zum Testen verwende ich in der Python-Konsole so etwas:
Dann werden Änderungen übernommen und nicht aus dem Cache gelesen.
Code: Select all
exec(open('/pfad/zum/python/skript.py').read())
A Sketcher Lecture with in-depth information is available in English, auf Deutsch, en français, en español.
Re: Macro / script / Compilieren
Hi
maybe :
How to avoid .pyc files?
(not tested)
mario
maybe :
How to avoid .pyc files?
Code: Select all
import sys
sys.dont_write_bytecode = True
mario
Maybe you need a special feature, go into Macros_recipes and Code_snippets, Topological_data_scripting.
My macros on Gist.github here complete macros Wiki and forum.
My macros on Gist.github here complete macros Wiki and forum.
Re: Macro / script / Compilieren
vielen Dank für die Hinweise
ist gut geeignet um die .py syntaktisch vom Compiler prüfen zu lassen.
eine neue .pyc wird auch erstellt.
ist gut geeignet, wenn ich die alte .pyc dabei nicht überschreiben will
Sie wird aber erst nach einem FeeCAD - Neustart ausgeführt. Was ich brauche, wenn ich die Funktionsweise Testen will.
Gibt es vielleicht noch einen Trick, um das Modul aus dem cash zu werfen, damit es ohne Neustart neu geladen wird?
Gruß Rainer
Code: Select all
exec(open('/pfad/zum/python/skript.py').read())
eine neue .pyc wird auch erstellt.
Code: Select all
import sys
sys.dont_write_bytecode = True
Sie wird aber erst nach einem FeeCAD - Neustart ausgeführt. Was ich brauche, wenn ich die Funktionsweise Testen will.
Gibt es vielleicht noch einen Trick, um das Modul aus dem cash zu werfen, damit es ohne Neustart neu geladen wird?
Gruß Rainer
Re: Macro / script / Compilieren
Ich habe eine Python-Datei, /tmp/test.py mit folgendem Inhalt:
Wenn ich in der Konsole folgendes ausführe:
Dann wird die Zahl 1 in der Konsole ausgegeben. Wenn ich nun im Code die 1 durch eine 2 erstetze und die Datei auf dieselbe Weise nochmal einlese, dann wird die 2 ausgegeben. Was ist bei Dir anders?
Code: Select all
print(1);
Code: Select all
# exec(open('/tmp/test.py').read())
A Sketcher Lecture with in-depth information is available in English, auf Deutsch, en français, en español.
Re: Macro / script / Compilieren
Hallo chrisb und Gift
bei mir ist es auch so, aber das Problem ist, wie meist, noch etwas komplexer.
Diese .py ruft noch weitere .py auf. Und die müssen auch neu.
Der letzte Tip von Gift ist die Lösung:
t1.test() ruft etwas in test2 auf.
ich schreibe mir jetzt ein Macro mit dem alle meine Module neu geladen werden
Vielen Dank Rainer
bei mir ist es auch so, aber das Problem ist, wie meist, noch etwas komplexer.
Diese .py ruft noch weitere .py auf. Und die müssen auch neu.
Der letzte Tip von Gift ist die Lösung:
Beide Module werden neu geladen.import importlib
import Rainers.test.test1 as t1
import Rainers.test.test2 as t2
importlib.reload(t1)
importlib.reload(t2)
t1.test()
t1.test() ruft etwas in test2 auf.
ich schreibe mir jetzt ein Macro mit dem alle meine Module neu geladen werden
Vielen Dank Rainer
Re: Macro / script / Compilieren
+1
und wenn du dem reload script noch eine button in der iconleiste gibtst ist so wie es hier seit Jahren reibungslos und einfach funktioniert.
beachte, das dies nicht recursiv funktioniert. Wenn Du in deinem script ein weiteres script importierst und anpassungen an dem machst, sollte dies entweder in dem reload script auch wieder geladen werden oder in dem script von dem geladen wird folgt nach dem import gleich ein reload. Aufpassen bei imports im sinne von from xy import z as abc Evtl. ist dann abc nicht reloaded.