Support Forum

Explizites Reload des PythonPart ohne Neustart von Allplan [Gelöst]


Weiss jemand wie kann das python modul meines PythonPartes ohne Neustart von Allplan explizit neu geladen werden ?

Hintergrund:
es hat einen kleinen codefehler im modul des PythonParts (py) infolge einer Anpassung im Code. Das trace fenster gibt auch den Fehler aus. Wenn der Fehler angepasst wurde wird in vielen Fällen noch der alte Code ausgeführt. Das ganze passiert nur bei Fehlern, aber nicht bei allen. Ganz sicher hilft ein Neustart von Allplan zum Ausführen des abgeänderten Codes. Einfach auf ein anders PythonPart (pyp) klicken und wieder das fehlerhafte hilft nicht. Das hilft nur bei fehlerlosen Anpassugen im Code in jedem Fall.

Ist einfach ein wenig nervig alle Nase lang Allplan neu zu starten während der Programmierung.

gruss bernd

Lösung anzeigen Lösung verbergen

..geht auch einfacher!

Dazu musst Du nur im Framwork eine Datei ändern:

CreateLibraryPreview.py
Zeile 41:
build_element_script = BuildingElementUtil.import_building_element_script(build_ele_list[0], False)
Ändern in
build_element_script = BuildingElementUtil.import_building_element_script(build_ele_list[0], True)

Dann wird in BuildingElementUtil.py
Zeile 37 folgendes ausgeführt:
if reload_script:
script = importlib.reload(script)

Fertig ist die Laube!
Ich denke mal, die Jungs von Allplan haben das wegen der Performance dort nicht immer neu geladen...

Gruß Jörg

1 - 10 (13)

Hallo Bernd,

könntest du vielleicht ein Beispiel anhängen bzw. den Ausschnitt vom Trace?
Es wäre interessant zu wissen, bei welchem Tippfehler z.B. genau das auftritt, dann kann ich das an die Entwicklerkollegen weiterleiten.

Grüße,
Akin

heisst das ist nicht möglich, oder anders das anklicken einer pyd datei sollte eigentlich das PythonPart vollkommen reloaden, was aber bei mir nicht passiert ?!?

Ich versuche mal einen sicheren case zu erstellen ...

grüsse bernd

Hallo,

"import module" importiert das Modul nur, wenn es noch nicht im namespace vorhanden ist. Wenn's schon da ist, passiert gar nichts.

import imp
imp.reload(module)

erzwingt einen Refresh des Moduls.
Es ist doch im Framework so eingebaut, daß das .py-Script beim Einfügen des
PythonParts neu importiert wird. Ein Klick auf das Element in der Bibliotheks-Palette reicht dazu alerdings nicht. Da wird nur das Preview mit dem alten Script generiert.

Gruß Jörg

Zitiert von: Nemo
Hallo,
"import module" importiert das Modul nur, wenn es noch nicht im namespace vorhanden ist. Wenn's schon da ist, passiert gar nichts.
import imp
imp.reload(module)
erzwingt einen Refresh des Moduls.
Es ist doch im Framework so eingebaut, daß das .py-Script beim Einfügen des
PythonParts neu importiert wird. Ein Klick auf das Element in der Bibliotheks-Palette reicht dazu alerdings nicht. Da wird nur das Preview mit dem alten Script generiert.
Gruß Jörg
Danke Jörg, genau hier ist das Problem wenn ein Syntaxfehler drin ist lässt sich das Python Part eben gar nicht einfügen, da für das Vorschau erstellen ja das allte fehlerbehaftete Script verwendet wird, und die Vorschau nicht erstellt werden kann, bricht das Script ab, obwohl der Fehler ja eigentlich schon behoben ist. Daher nun die Frage wie ich ein Reload für die Vorschau erzwingen kann ohne allplan neu zu starten.

Ich habe eine Idee. Ich erstelle mir eine zweite pyd datei mit Referenz auf genau das selbe script. Wenn ich einen error im script habe der mir das erstellen der Vorschau verhindert nutze ich die andere pyd datei. Mhh ne das funktioniert nicht, da die andere pyd ja auch wieder nur das importierte fehlerhafte modul ausführt und das modul nicht neu läd.

Lässt sich das erstellen der vorschau vollkommen deaktivieren?

Mhh trotzdem wiedermal vielen Dank Jörg

..geht auch einfacher!

Dazu musst Du nur im Framwork eine Datei ändern:

CreateLibraryPreview.py
Zeile 41:
build_element_script = BuildingElementUtil.import_building_element_script(build_ele_list[0], False)
Ändern in
build_element_script = BuildingElementUtil.import_building_element_script(build_ele_list[0], True)

Dann wird in BuildingElementUtil.py
Zeile 37 folgendes ausgeführt:
if reload_script:
script = importlib.reload(script)

Fertig ist die Laube!
Ich denke mal, die Jungs von Allplan haben das wegen der Performance dort nicht immer neu geladen...

Gruß Jörg

Zitiert von: Nemo
Dazu musst Du nur im Framwork eine Datei ändern:
CreateLibraryPreview.py
Mist meine filesuche findet die Datei nicht. Herumsuchen im Allplanordner brachte auch keinen Erfolg. Wo liegen die Frameworkdateien?
...
Zitiert von: Nemo
Ich denke mal, die Jungs von Allplan haben das wegen der Performance dort nicht immer neu geladen...
Was ja auch vollkommen Sinn macht solange man den code nicht ändert ...

gruss bernd

wieso gibt auf windows eigentlich keine bash

Allmenu -> Service -> Windows-Explorer -> Allgemeine Programmdaten (ETC,LIC)

Dort gibts ein Verzeichnis Etc\PythonPartsScripts,
wo alle Framwork-Dateien drinnen liegen.
Bei mir findet die Windows-Suche die auch!

Gruß Jörg

OK wenn man im "Program Files" Verzeichnis nach einer Datei sucht die im "ProgramData" Verzeichnis liegt, kann man die auch nicht finden ...

Und wieder mal vielen Dank

Funktioniert bei Dir dieser import? https://connect.allplan.com/ch_de/forum/themen/topic/topics/pythonparts/importproblem.html

- ich habe drei Vermutuungen zur Auswahl
-- das funktioniert nur in Python 2.7 nicht in 3.x (in 2.7 hab ich getestet)
-- ich mache etwas falsch
-- Allplan hat einen Fehler in der Hinsicht der Importe

gruss bernd

Nur kurz als info. Der Reload funktioniert wunderbar.

@Akin: Beispiel hat sich somit auch erledigt.

1 - 10 (13)

https://connect.allplan.com/ verwendet Cookies  -  Mehr Informationen

Akzeptieren