Seite 1 von 1

Diggles SDK

Verfasst: Mi 8. Jul 2020, 22:34
von zed2000
Installation
Einfach die https://github.com/ktksgit/barnacle/rel ... _0.2.0.zip Datei entpacken nach
C:/pfad/wo/ich/das/zip/entpackt/habe/diggles_sdk, z.B. C:/diggles_sdk

Sourcecode, PRs welcome

Das Diggles SDK bietet:
  • Beliebige Ausführung von Python Code aus TCL heraus
  • Es wird kein Mod mitgeliefert. Das SDK ist dafür gedacht Mods für Wiggles in Python und C++ zu entwickeln
  • Interoperabilität zwischen TCL und Python
  • Self-Contained Python Installation
  • Nach Bootstrapping reicht ein einfacher Doppelklick auf Wiggles.exe/Diggles.exe
  • Hilfreiche Klasse pytcl in examples/pytcl.py
  • Beispiel Python code

    Code: Alles auswählen

    import pytcl
    tcl = pytcl.Tcl()
    
    # Cached alle globalen TCL Variablen
    g = tcl.globals
    
    # Liest die TCL Variable info_string
    g.info_string
    
    # Ruft eine TCL Funktion auf.
    # TCL Equivalent: set name [get_objname this]
    g.name = tcl.get_objname('this')
  • Wieso funktioniert ein TCL zu Python binding? Der Einstiegspunkt ist load tclandpython.dll. Hiermit können beliebige native DLLs nachgeladen werden. tclandpython.dll stellt damit aus TCL Sicht einen Python Interpreter bereit und aus Python Sicht native Implementierungen der Module _native, _tcl, cpptcl

    Low Level TCL Code Schnippsel

    Code: Alles auswählen

    load tclandpython.dll
    set py [PythonInterpreter]
    
    $py import pytcl
    
    # Ein Python Funktion multiply definieren. value2 wird vollautomatisch zu float konveriert.
    Alles wird von TCL -> Python konvertiert (string, float, integer) wenn ein type hint angegeben ist. Ohne type hint wird versucht aus einem TCL Type einen equivalenten Python Type zu finden. Autokonvertierung funktioniert nicht, wenn TCL für ein einzelnes Tcl_Obj keine Typinformation hinterlegt hat, sodass unerwartet z.B "2.6" als string in Python erscheinen kann.
    $py exec {
    def multiply(value, value2: float):
        return value * value2
    }
    
    # Mache multiply in TCL aufrufbar. $py eval .... liefert immer einen Wert zurück, der automatisch in ein TCL Objekt konvertiert wird. Alles wird von Python -> TCL konvertiert (string, float, integer) außer eigene Python Klassen, dict, list.
    $py eval {pytcl.Tcl.proc("multiply", multiply)}
    
    # Rufe multiply auf, also eine in Python implementierte Funktion aus TCL heraus.
    set result [multiply 2 5.1]
    
Beispiele

Die Beispiele zeigen, wie man das Verbindungsglied tclandpython.dll aus Wiggles heraus lädt.
Alle Beispiele laufen, sobald man die entsprechenden Zeilen in *.tcl in Data/ bzw. Data/Scripts/ angepasst hat.
Ein Doppelklick auf Wiggles.exe genügt. Wiggles bitte im Fenstermodus starten.

1. Bootstrapping
Um die mitgelieferten Beispiele auszuprobieren, ist ein examples/bootstrap.tcl mitgeliefert.
Am besten in die

Code: Alles auswählen

systeminit.tcl
die Zeile

Code: Alles auswählen

source C:/diggles_sdk/examples/bootstrap.tcl
einfügen. Damit wird die tclandpython.dll gefunden. Nach dem Bootstrapping passiert erstmal nichts.
Bei den unteren Beispielen passiert mehr.

2. TCL und Python Interoperatiblität


Diese Zeilen an Data\Scripts\classes\zwerg\zwerg.tcl ans Ende von obj_init einfügen:

Code: Alles auswählen

load tclandpython.dll
set py [PythonInterpreter]
$py import ex02.zwerg
$py eval ex02.zwerg.listen_to_all_procedures()
Dadurch bekommt man einen riesigen Log über aufgerufenen TCL Prozeduren.
Zusätzlich werden alle TCL Variable getraced. Das Tracen ist sehr Performancehungrig.

Getestet mit v0.1.0 !!

3. Jupyter Console starten
Zuerst müssen eine Anwendungen in der Python Installation mittels pip nachinstalliert werden.
Doppelklick auf examples/install_requirements.bat
Jupyter ist eine Interaktive Console, in der man fast beliebigen Python Code laufen lassen kann.

Diese Zeilen an belieber TCL Code Stelle (nach dem Bootstrapping aus Beispiel 1) einfügen

Code: Alles auswählen

set python_path C:/diggles_sdk/bin/python36
load tclandpython.dll
set py [PythonInterpreter]
$py import ex01.ipy_kernel
$py eval ex01.ipy_kernel.main('$python_path/python.exe')
4. Nativen Code mit Python ersetzen
Ein Blick in examples/hook.py offenbart was möglich ist.
Als exemplarisches Beispiel wurde einfach der native Code der TCL-Prozedure "call" durch ein Pythoncode ersetzt.
Das Marshalling des nativen Codes ist zwar händsärmlich gelöst, alles bis ca. Zeile 140, man kann hier sicherlich noch einiges dem Entwiggler abnehmen. Aber ab Zeile 140, da fängt die eigentliche Funktionalität an, auf die es sich lohnt einen Blick zu werfen.


Wie man Python debugged


Ihr könnt Python debuggen, REPL eines Debuggers nutzen, Hot Reloading von Python nutzen, Code zur Laufzeit nachladen um seinen Mod schneller und effektiver zu schreiben.

Python wird Self-Contained ausgeliefert, deswegen muss entweder mittels pip ptvsd installiert werden -> How to use PIP

Für VSCode irgendwo im Python Code Folgendes einfügen VSCode Python Remote Debugging starten.

Code: Alles auswählen

import ptvsd; ptvsd.enable_attach(); ptvsd.wait_for_attach()
Ausblick
  • Mehr Beispiele wie das TCL Python Binding funktioniert
  • Beschreibung der Autokonvertierung zwischen Tcl_Obj <-> PyObject, was funktioniert und was nicht
  • ABI Detektion vereinfachen
  • Mods, die mit Diggles SDK erstellt werden, sollten mit Mod Manager auslieferbar sein. Bisschen kompliziert, da sowohl native DLLs als auch Python Dateien in einem Mod dabei wären.

Re: Diggles SDK

Verfasst: Do 9. Jul 2020, 10:25
von cech12
Das sieht auf jeden Fall vielversprechend aus! :D
Ich bin auf jeden Fall bereit, es mit in den ModManager aufzunehmen, wenn es dann soweit ist. :)

Diggles SDK 0.2.0

Verfasst: Mo 31. Mai 2021, 00:01
von zed2000
Offenbar wurde eine neue Version https://github.com/ktksgit/barnacle/releases/tag/v0.2.0 vom Entwiggler released.
Es lohnt sich einen Blick drauf zu werfen und Feedback zu geben.

Ein neues Hauptfeature ist wohl:
* Implementierung von nativen Code in Python und aufrufen von nativem Code aus Python heraus.

Das Standard-Feature ist wohl:
* Beliebig zwischen Python und TCL bei der Mod Entwicklung zu wechseln und gleichzeitig auch noch puren Pythoncode im Debugger zu betrachten und sich über einen Debugger richtig dolle freuen. Allein die REPL Funktion boosted schon bei der Entwigglung.

Schwierigkeiten macht wohl noch die Paketierung von Python als Self-Contained, aber darum sollte sich kein Entwiggler kümmern müssen, und eigentlich sollte es klappen. Auf einem Rechner hats geklappt, d.h. ausprobieren und Feedback geben und sich bei Problemen gerne melden.

Aber seht selbst: posting.php?mode=reply&f=10&t=315#pr1865