Python in C++ funktioniert nicht...

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
DonnerCobra
User
Beiträge: 53
Registriert: Mittwoch 9. April 2008, 19:35

Mittwoch 16. April 2008, 21:08

Hallo,

ich habe nochmal ein Problem mit "eingebettetem" Python in meinem C++ Programm. Ich schreibe ein Plugin für ein Programm, dem ich dadurch Python Scripting "beibringen / ermöglichen" möchte, so das Benutzer des Programms einfacher darauf zugreifen können.

Mein Problem ist folgendes. Mein Plugin ist eine Objektklasse, da man von meinem Programm halt mehrere "Objekte" erstellen kann.

Um mein Plugin einzubinden reserviert (allocate) das Hauptprogramm einen gewissen Speicherbereich. Leider stürzt das Hauptprogramm ab, sobald ich über "irgendeine" Art von GuI ein "Hallo Welt" erzeugen möchte. :(

Platziere ich diesen Python Embedding-Command außerhalb der Klasse, also beispielsweise zu der main Funktion, wo meine Klasse erst noch registriert wird und noch keine Instanz davon vorhanden ist, funktioniert alles bestens.

Ich werde daraus nicht schlau, kann mir jemand helfen? Danke...


P.S. Wenn ich ein eigenes Kommandozeilenprogramm in C++ schreibe und es dort in eine Klasse packe, funktioniert alles bestens, dort wird sie aber halt auch nicht reserviert und damit eingegrenzt.
BlackJack

Mittwoch 16. April 2008, 23:20

Du machst wahrscheinlich irgend etwas falsch. Mehr kann man ohne zu wissen was Du genau machst, einfach nicht sagen.

Du musst einfach genauer werden. Wenn Du zum Beispiel schreibst "Mein Plugin ist eine Objektklasse", wovon reden wir dann? Python? C++?

Schreib doch mal eine minimale C++-Anwendung plus Python-Plugin, die das Problem hat, so dass man das auch nachvollziehen kann.
DonnerCobra
User
Beiträge: 53
Registriert: Mittwoch 9. April 2008, 19:35

Donnerstag 17. April 2008, 07:02

Hi!

Danke sehr für die Antwort.

Code: Alles auswählen

class NODing : public GvOperatorData
{
private:

public:
	
  virtual Bool iCreateOperator(GvNode *bn)
  {
    BaseContainer* data = bn->GetOpContainerInstance();
    if (!data) return FALSE;
    
    return SUPER::iCreateOperator(bn);
  }  
  
  Bool Calculate(GvNode *bn, GvPort *port, GvRun *run, GvCalc *calc)
  {
			Py_Initialize();
                        PyEval_InitThreads();

                        char *arg[] = {"", "0"};
                        PySys_SetArgv(0, arg);

                        PyRun_SimpleString("from Tkinter import *");
			PyRun_SimpleString("root = Tk()");
			PyRun_SimpleString("w = Label(root, text='Hello, world!')");
			PyRun_SimpleString("Outport = 5 ** 4");
			PyRun_SimpleString("w.pack()");
			PyRun_SimpleString("root.mainloop()");

			Py_Finalize();

		return true;

  }
  
  static NodeData* Alloc(void) { return gNew NODing; }
};


Bool RgisterNODing()
{
    return GvRegisterOperatorPlugin(... ,NODing::Alloc, ...);
}



1. Die Methode RgisterNODing (unten) wird ausgeführt wenn das Hauptprogramm mein Plugin im Hauptprogramm registriert registriert.

2. Die Methode Calculate wird ausgeführt wenn ein Objekt von der Klasse erzeugt wurde und ausgeführt wurde. Mittels "Alloc" wird Speicher freigeräumt.

3. Wenn ich den Python Interpreter Code an die Stelle packe, wo die Klasse registriert wird, also beispielsweise vor oder nach GvRegisterOperatorPlugin funktioniert alles bestens. Warum nicht in der Objektklasse, und dann MEIST auch nur, wenn ich eine GUI aufrufe!?

Bye und danke nochmal.
DonnerCobra
User
Beiträge: 53
Registriert: Mittwoch 9. April 2008, 19:35

Dienstag 29. April 2008, 20:52

Hi!

Es häufen sich derzeit die C++ Python Fragen. Eventuell hat ja doch einer noch eine Idee!?
Antworten