Scripting mit Lua bzw. Python
Scripting mit Lua bzw. Python
Hiho,
bisher sind mir zwei Skriptsprachen untergekommen, die in Verbindung mit C++ Programmen für Scripte genutzt werden: Lua und Python.
Ich selber bin großer Python-Fan (einfach tolle Syntax und insgesamt ne schöne rapid-dev-sprache). Daher weiß ich nicht, ob ich Python als Skriptsprache verwenden soll oder Lua. Welche würdet ihr mir empfehlen?
Kennt jemand gute Tutorials, um zwischen C++ und Lua bzw. Python Datenstrukturen auszutauschen? Gemeint ist: Habe ich in C++ z.B. eine Klasse Foo und will in Lua / Python mit einer bestimmten Instanz dieser Klasse arbeiten und dem C++ Programm diese Instanz anschließend zurückgeben (usw.)
LG Glocke
bisher sind mir zwei Skriptsprachen untergekommen, die in Verbindung mit C++ Programmen für Scripte genutzt werden: Lua und Python.
Ich selber bin großer Python-Fan (einfach tolle Syntax und insgesamt ne schöne rapid-dev-sprache). Daher weiß ich nicht, ob ich Python als Skriptsprache verwenden soll oder Lua. Welche würdet ihr mir empfehlen?
Kennt jemand gute Tutorials, um zwischen C++ und Lua bzw. Python Datenstrukturen auszutauschen? Gemeint ist: Habe ich in C++ z.B. eine Klasse Foo und will in Lua / Python mit einer bestimmten Instanz dieser Klasse arbeiten und dem C++ Programm diese Instanz anschließend zurückgeben (usw.)
LG Glocke
Rage - ein "modernes" Rogue-like (C++11, SFML)
- fat-lobyte
- Beiträge: 1398
- Registriert: Sa Jul 05, 2008 12:23 pm
- Wohnort: ::1
- Kontaktdaten:
Re: Scripting mit Lua bzw. Python
Hallo, von Lua hab ich leider keine Ahnung, aber ich glaube da wird dir Kerli weiterhelfen können.Glocke hat geschrieben:Ich selber bin großer Python-Fan (einfach tolle Syntax und insgesamt ne schöne rapid-dev-sprache). Daher weiß ich nicht, ob ich Python als Skriptsprache verwenden soll oder Lua. Welche würdet ihr mir empfehlen
Von Python weiß ich, dass es eine API für C gibt: http://docs.python.org/3/c-api/
Diese mit C++ zu benutzen ist natürlich ziemlich anstrengend.
Daher hat jemand vor einiger Zeit die C++-Python Bibliothek geschrieben, die anscheinend sogar gut genug für Boost war: http://www.boost.org/doc/libs/1_52_0/libs/python/doc/
Das klingt erstmal gut, allerdings hat die Sache einen Haken: Boost.Python hat seit 2003 keine Änderungen gesehen. Ich weiß nicht, ob und wie es mit Python 3 funktioniert, und ob es gröbere Probleme gibt.
Tutorials kann ich dir keine Empfehlen, da ich so etwas nie versucht habe.
Haters gonna hate, potatoes gonna potate.
- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: Scripting mit Lua bzw. Python
MadShadow wollte etwas zu Lua schreiben, aber das ist noch nicht fertig. Bisher habe ich mit Lua leider auch noch nichts zu tun gehabt.
Für Python brauchst Du ein C-Interface für die C++-Klasse.
Für Python brauchst Du ein C-Interface für die C++-Klasse.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Re: Scripting mit Lua bzw. Python
Will ich auch immer nochXin hat geschrieben:MadShadow wollte etwas zu Lua schreiben,[...]

Aber erstmal muss ich noch Erfahrungen sammeln. Ich will mein Tutorial nochmal neu strukturieren und dem ganzen ein Ziel geben. Die Sache mit "warum Lua lernen" ist immer noch nicht so klar.
Wie man Lua in C++ implementieren kann interessiert mich auch sehr.

Re: Scripting mit Lua bzw. Python
Lua wurde ja von Haus aus als Skriptsprache von Programmen konzipiert die in irgendeiner Weise auf C-Code zurückgreifen können und kann daher ohne zusätzliche Bibliotheken direkt aus C/C++ heraus angesprochen werden. Ohne entsprechende Hilfsfunktionen oder Klassen kann das Registrieren von Funktionen und Klassen schnell sehr umständlich werden. Ich habe dafür vor einiger Zeit einmal Luabind verwendet (Eine Bibliothek zur Anbindung von C++ und Lua) wo der nötige Code zum Registrieren einer Klasse in einem Namespace mit ein paar Membern in etwa wie folgt ausschauen kann:
In Lua kann man dann die Klasse wie folgt verwenden (Nicht getestet!):
Die Syntax von Lua ist allerdings recht gewöhnungsbedürftig, daher würde ich eher auf Python, Javascript oä. setzten, wobei ich mich damit selbst eigentlich auch noch nicht wirklich beschäftigt habe. In FlightGear wird zb. Nasal eingesetzt, eine ua. stark an Javascript angelehnte Sprache. Auch Python ist von der Syntax und auch den dahinter liegenden Prinzipien deutlich näher an C++ als Lua.
Code: Alles auswählen
module(_lua_state, "my_namespace")
[
class_<LuaScene>( "Scene" )
.def(constructor<>())
.def("test", &LuaScene::test)
.def_readonly("test_field", &LuaScene::_test)
.scope
[
def("change", &LuaScene::change)
]
];
Code: Alles auswählen
test_scene = my_namespace:Scene()
test_scene:change("2nd-level")
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)
OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at
OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at
Re: Scripting mit Lua bzw. Python
fat-lobyte hat geschrieben:Von Python weiß ich, dass es eine API für C gibt: http://docs.python.org/3/c-api/
Diese mit C++ zu benutzen ist natürlich ziemlich anstrengend.
Xin hat geschrieben:Für Python brauchst Du ein C-Interface für die C++-Klasse.
fat-lobyte hat geschrieben:Daher hat jemand vor einiger Zeit die C++-Python Bibliothek geschrieben, die anscheinend sogar gut genug für Boost war: http://www.boost.org/doc/libs/1_52_0/libs/python/doc/
Das klingt erstmal gut, allerdings hat die Sache einen Haken: Boost.Python hat seit 2003 keine Änderungen gesehen. Ich weiß nicht, ob und wie es mit Python 3 funktioniert, und ob es gröbere Probleme gibt.
Das klingt jetzt alles nicht so toll. Ehrlich gesagt weiß ich nicht was ich jetzt macheKerli hat geschrieben:Die Syntax von Lua ist allerdings recht gewöhnungsbedürftig, daher würde ich eher auf Python, Javascript oä. setzten, wobei ich mich damit selbst eigentlich auch noch nicht wirklich beschäftigt habe.


LG Glocke
Rage - ein "modernes" Rogue-like (C++11, SFML)
- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: Scripting mit Lua bzw. Python
In der Firma wurde wohl Boost-Python-Modul verwendet, dass Dich hier bei Klassen unterstützen kann. Jedenfalls war man damit zufrieden damit. Python 3 verwenden wir allerdings (noch) nicht:Glocke hat geschrieben:Xin hat geschrieben:Für Python brauchst Du ein C-Interface für die C++-Klasse.
fat-lobyte hat geschrieben:Daher hat jemand vor einiger Zeit die C++-Python Bibliothek geschrieben, die anscheinend sogar gut genug für Boost war: http://www.boost.org/doc/libs/1_52_0/libs/python/doc/
Das klingt erstmal gut, allerdings hat die Sache einen Haken: Boost.Python hat seit 2003 keine Änderungen gesehen. Ich weiß nicht, ob und wie es mit Python 3 funktioniert, und ob es gröbere Probleme gibt.
Die Überwindung von Sprachkonzeptgrenzen würde ich sowieso grundsätzlich eher vermeiden. Das lässt sich aber nicht immer vermeiden.Glocke hat geschrieben:Das klingt jetzt alles nicht so toll. Ehrlich gesagt weiß ich nicht was ich jetzt macheIch frage mich ob sich der ganze Aufwand mit der Einbindung einer Skriptsprache lohnt, und ob ich nicht einfach das ganze Teil von vorne bis hinten in C++ schreibe.
Ausschlaggebend für die Entscheidung ist immer: Was möchte man eigentlich erreichen?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Re: Scripting mit Lua bzw. Python
Imho werden Scriptsprachen ja verwendet, um Teile der Programmlogik "schneller" realisieren zu können. Soweit ich das überblicke, geht dieses "schneller" auf Kosten von Performance (die Skripte werden ja vermutlich interpretiert) und Typsicherheit (gerade wenn ich da an Python denke). Ich frage mich derzeit, ob das wirklich so "gut" ist - mal abgesehen vom Aufwand, das sinnvoll einzubauen.
LG Glocke
LG Glocke
Rage - ein "modernes" Rogue-like (C++11, SFML)
- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: Scripting mit Lua bzw. Python
Rapid-Prototyping-Sprachen - also besonders gerne auch dynamisch typisierte Sprachen - helfen dabei "Programmlogik" schneller zu implementieren, weil sie teilweise "Boilerplate" (Quelltext, der nicht zur Programmlogik gehört) ersparen, man also mehr rapid ist.Glocke hat geschrieben:Imho werden Scriptsprachen ja verwendet, um Teile der Programmlogik "schneller" realisieren zu können. Soweit ich das überblicke, geht dieses "schneller" auf Kosten von Performance (die Skripte werden ja vermutlich interpretiert) und Typsicherheit (gerade wenn ich da an Python denke). Ich frage mich derzeit, ob das wirklich so "gut" ist - mal abgesehen vom Aufwand, das sinnvoll einzubauen.
Wichtig ist dabei aber eben auch das "Prototype": Es ist nicht zum sinnvollen Einsatz gedacht. Das bedeutet nicht, dass ein sinnvoller Einsatz nicht möglich wäre, aber es geht eben um schnell eine Logik zu implementieren und zu testen - nicht um sicher oder schnell ausführbar.
Das ist dann zum Beispiel gut, wenn Dinge "rapid" austauschbar sein sollen. Ein Plugin in C/C++ entspräche einer .dll, die erst aufwendig kompiliert werden muss, während man in ein Python-Skript "rapid" mal kopieren und dann einfach drin rumexperimentieren kann.
Diese Sprachen haben also vollkommen unterschiedliche Ansätze. Und am Ende wieder die Frage: Was brauchst Du für Dein konkretes Problem? ^^
(wobei "Ich will's halt mal ausprobieren" kein schlechter Grund ist)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Re: Scripting mit Lua bzw. Python
Zunächst erstmal zum ausprobierenXin hat geschrieben:Und am Ende wieder die Frage: Was brauchst Du für Dein konkretes Problem? ^^
(wobei "Ich will's halt mal ausprobieren" kein schlechter Grund ist)

Und dann, wenn ich weiß wie es sich damit genau verhält, überlege ich mir den nächsten Schritt. Für mich ist dabei vor allem wichtig,
Mal ein "Beispiel" (oder eines, das mal ein Beispiel werden will

C++ Code
Code: Alles auswählen
class Foo {
protected:
int x;
public:
Foo(int x) { this->x = x; }
void increase() { this->x += 1; }
};
int main() {
Foo* myobject = new Foo(5)
Interpreter* i;
load_script(i, "test.py");
exec_func(i, "handle_foo", myobject);
// do other stuff
free_script(i);
}
Code: Alles auswählen
def handle_foo(obj):
obj.increase()
# do other stuff etc.
Rage - ein "modernes" Rogue-like (C++11, SFML)