Macro / script / Compilieren

In diesem Forum Fragen und Diskussionen in Deutsch
Forum rules
Foren-Regeln und hilfreiche Informationen

WICHTIG: Bitte zuerst lesen, bevor Sie posten
Post Reply
Rainer_B
Posts: 23
Joined: Tue Jun 15, 2021 3:07 pm
Location: Hamburg / Germany

Macro / script / Compilieren

Post by Rainer_B »

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
chrisb
Veteran
Posts: 53945
Joined: Tue Mar 17, 2015 9:14 am

Re: Macro / script / Compilieren

Post by chrisb »

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.
Rainer_B
Posts: 23
Joined: Tue Jun 15, 2021 3:07 pm
Location: Hamburg / Germany

Re: Macro / script / Compilieren

Post by Rainer_B »

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?
chrisb
Veteran
Posts: 53945
Joined: Tue Mar 17, 2015 9:14 am

Re: Macro / script / Compilieren

Post by chrisb »

Zum Testen verwende ich in der Python-Konsole so etwas:

Code: Select all

exec(open('/pfad/zum/python/skript.py').read())
Dann werden Änderungen übernommen und nicht aus dem Cache gelesen.
A Sketcher Lecture with in-depth information is available in English, auf Deutsch, en français, en español.
mario52
Veteran
Posts: 4674
Joined: Wed May 16, 2012 2:13 pm

Re: Macro / script / Compilieren

Post by mario52 »

Hi

maybe :

How to avoid .pyc files?

Code: Select all


import sys

sys.dont_write_bytecode = True

(not tested)

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.
Rainer_B
Posts: 23
Joined: Tue Jun 15, 2021 3:07 pm
Location: Hamburg / Germany

Re: Macro / script / Compilieren

Post by Rainer_B »

vielen Dank für die Hinweise

Code: Select all

exec(open('/pfad/zum/python/skript.py').read())
ist gut geeignet um die .py syntaktisch vom Compiler prüfen zu lassen.
eine neue .pyc wird auch erstellt.

Code: Select all

import sys
sys.dont_write_bytecode = True 
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
chrisb
Veteran
Posts: 53945
Joined: Tue Mar 17, 2015 9:14 am

Re: Macro / script / Compilieren

Post by chrisb »

Ich habe eine Python-Datei, /tmp/test.py mit folgendem Inhalt:

Code: Select all

print(1);
Wenn ich in der Konsole folgendes ausführe:

Code: Select all

# exec(open('/tmp/test.py').read())
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?
A Sketcher Lecture with in-depth information is available in English, auf Deutsch, en français, en español.
User avatar
Gift
Posts: 769
Joined: Tue Aug 18, 2015 10:08 am
Location: Germany, Sauerland

Re: Macro / script / Compilieren

Post by Gift »

Rainer_B
Posts: 23
Joined: Tue Jun 15, 2021 3:07 pm
Location: Hamburg / Germany

Re: Macro / script / Compilieren

Post by Rainer_B »

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:
import importlib
import Rainers.test.test1 as t1
import Rainers.test.test2 as t2
importlib.reload(t1)
importlib.reload(t2)
t1.test()
Beide Module werden neu geladen.
t1.test() ruft etwas in test2 auf.

ich schreibe mir jetzt ein Macro mit dem alle meine Module neu geladen werden :P

Vielen Dank Rainer
User avatar
bernd
Veteran
Posts: 12849
Joined: Sun Sep 08, 2013 8:07 pm
Location: Zürich, Switzerland
Contact:

Re: Macro / script / Compilieren

Post by bernd »

Rainer_B wrote: Tue Jun 29, 2021 3:45 pm Der letzte Tip von Gift ist die Lösung:
+1

Rainer_B wrote: Tue Jun 29, 2021 3:45 pm ich schreibe mir jetzt ein Macro mit dem alle meine Module neu geladen werden :P
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.
Post Reply