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 SchnippselCode: 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]
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
Code: Alles auswählen
source C:/diggles_sdk/examples/bootstrap.tcl
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()
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')
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()
- 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.