Einbetten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Jordy
User
Beiträge: 3
Registriert: Donnerstag 22. Juni 2006, 08:39

Hallo allerseits!

Ich bin dabei mich nach verschiedenen Skriptsprachen umzusehen. Ich will eine (oder mehrere davon) in eine C/C++ Applikation einbetten.
Dabei ist natürlich auch Python eine Möglichkeit, ich muss aber dazu sagen, daß ich mit Python bisher nichts gemacht habe.

Habe mir die entsprechenden Kapitel in der Docu durchgelesen, aber es scheint als wären einige Dinge als selbstverständlich angenommen worden, die ich nicht wirklich klären konnte.

Die erste und wichtigste Frage: Wenn ich Python in meine Applikation (windows) einbetten will, wie mache ich das Compiler-seitig? Muss ich eine statische *.lib linken? Muss ich eine DLL laden? Welche? Oder muss ich den Python-Interpreter gar auf Source-level zum Projekt hinzufügen?

Es scheint mir danach kein Problem zu sein, ein Skript zu interpretieren. Auch ist es einfach eine Applikationsfunktion innerhalb des Interpreters bekannt zu machen. Das wurde in der Doku alles gut beschrieben.
Ich bin mir aber z.B. garnicht sicher, ob (und wie) es möglich ist:
1) Von Python auf POD Variablen der Applikation zuzugreifen
1) Von Python auf C++-Objekte der Applikation zuzugreifen
2) Von der Applikation auf Variablen bzw. Objekte in Python zuzugreifen
3) Von der Applikation gezielt Python-Funktionen (in einer beliebigen Skriptdatei) aufzurufen

Mir würden eine paar Funktionsnamen oder vielleicht kurze Beschreibung des prinzipiellen Vorgehens zu obigen Punkten weiterhelfen. Wenn ich weiß wie die Werzeuge überhaupt *heißen* dann bin ich bestimmt auch in der Lage sie zu verstehen und zu gebrauchen.

Im Moment stehe ich leider wie der Ochse vorm Berg und komme nicht weiter. Leider scheint das einbette in Applikation auch nicht wirklich eine Standardverwendung für Python zu sein, jedenfalls findet man nicht allzuviele Beispiele oder Beschreibungen.

Danke für jeden Tip!
pr0stAta
User
Beiträge: 271
Registriert: Freitag 17. September 2004, 11:49
Wohnort: Bremen

Ich kann nur teilweise zu einem Punkt etwas sagen:
1) Von Python auf C++-Objekte der Applikation zuzugreifen
Ich habe immer mit Ctypes in Python auf C++ Methoden zugegriffen:

Code: Alles auswählen

import ctypes
dll = ctypes.windll.LoadLibrary('DLLTest.dll')
if dll:
  powerInt = dll.powerInt
  ergebnis = powerInt(i, j)
  print 'C++ Ergebnis =', ergebnis
else:
  print 'DLL konte nicht geladen werden'
Die passende dll sah so aus:

Code: Alles auswählen

int _stdcall powerInt(int x , int y)  // diese Funktion wird exportiert, siehe Datei DLLTest.def
{
// Summe von x bis y ermitteln
int	erg = 2;

	while(x < y)
	{
		erg = erg^x;
		x++;
	}
	return erg;
}
Vielleicht hilft es ja etwas ;) Gruss prosta
Jordy
User
Beiträge: 3
Registriert: Donnerstag 22. Juni 2006, 08:39

Hm, nicht ganz das was ich suche. Das Problem ist: Ich habe garkeine DLL. Ich habe eine Applikation, also ein *.exe.

Ich könnte natürlich alle Variablenzugriffe durch Funktionszugriffe kapseln, dann wäre ich wieder bei dem Punkt den ich verstanden habe, nämlich Funktionen der Applikation (die mit Py_InitModule() bekannt gemacht wurden) aus Python heraus aufzurufen.
Ich dachte aber an direkte Zugriffe. Also ohne Zugriffsfunktionen. Ich habe herausgefunden daß TCL dazu in der Lage ist. Auch für den C++ interpeter Ch sind Möglichkeiten gegeben, Applikations-Variablen dem Skript direkt bekannt zu machen. Das zugehörige Kapitel der Python Doku ist im Vergleich leider recht kurz und sagt nichts zu Variablen.
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Schau dir mal SWIG und Boost.Python an.
Das vereinfacht einem vieles. Und ja, du musst gegen Python24.DLL (oder welche Version auch immer) linken.
Jordy
User
Beiträge: 3
Registriert: Donnerstag 22. Juni 2006, 08:39

Joghurt hat geschrieben:Schau dir mal SWIG und Boost.Python an.
Das vereinfacht einem vieles. Und ja, du musst gegen Python24.DLL (oder welche Version auch immer) linken.
Beides geniale Projekte. Trotzdem scheint mir, als würden sie mir nicht weiterhelfen. Wenn ich es richtig verstanden habe, setzen beide Konzepte ausschließlich auf C/C++ DLLs, nicht auf Applikationen mit eigener main() auf. Jedenfalls wüßte ich nicht, wie ich beides in eine Anwendung integrieren könnte.
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Doch, du kannst die entsprechenden .c Files mit in deine Applikation einbinden, in deinem Hauptprogramm musst du noch ein #include <Python.h> machen und den Interpreter initialisieren.

Beispiel:
test.cpp:

Code: Alles auswählen

#include <iostream>
#include <boost/python.hpp>
using namespace boost::python;
using namespace std;

void foo()
{
  cout << "Hello from foo" << endl;
}

int square(int x)
{
  return x*x;
}

class Bar {
  public:
    void baz();
};

void Bar::baz()
{
  cout << "Bar::baz called" << endl;
}


BOOST_PYTHON_MODULE(example)
{
  def("foo", &foo);
  def("square", &square);
  class_<Bar>("Bar")
    .def("baz", &Bar::baz)
  ;
}

#include <Python.h>
int main()
{
  FILE* f = fopen("examplescript.py", "r");
  Py_Initialize();
  initexample(); // format: initMODULNAME; wird von Boost.Python definiert
  PyRun_SimpleFile(f, "Test");
  fclose(f);
  Py_Finalize();
}
examplescript.py:

Code: Alles auswählen

import example
print "Hello from Python. Calling foo"
example.foo()
print "42 squared is", example.square(42)
a = example.Bar()
print "Calling a.baz()"
a.baz()


Kompilieren und ausführen (Linux; Ubuntu Dapper)

Code: Alles auswählen

$ g++ test.cpp -I/usr/include/python2.4/ -lboost_python -lpython2.4
$ ./a.out
Hello from Python. Calling foo
Hello from foo
42 squared is 1764
Calling a.baz()
Bar::baz called
HTH
Mad-Marty
User
Beiträge: 317
Registriert: Mittwoch 18. Januar 2006, 19:46

http://www.python.org/doc/ext/embedding.html

http://www.codeproject.com/cpp/embedpython_1.asp



achja, embedding ist garnicht so selten.
Viele aktuelle spiele z.b. nutzen Python als steuersprache.


Da oben hast du auch gleich ein beispiel.
Antworten