Embeded Python Interpreter anhalten und weiterlaufen

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
ruena
User
Beiträge: 2
Registriert: Mittwoch 18. Mai 2011, 13:09

Ich habe ein C++-Programm mit einer Mainloop. In der Mainloop soll nebenbei ein Python Programm abgearbeitet werden. Die Anwendung soll nicht multithreaded sein.
Das Python Programm soll pause_interpreter() aufrufen, der Interpreter soll sich selbst anhalten, dann soll die Mainloop wieder einmal dran kommen, dann soll der Interpreter wieder an der alten Stelle weiterlaufen.

So stelle ich mir das ungefähr vor:

Code: Alles auswählen

#include <Python.h>

//das Python Programm
const char *program = 
    "import api \n"
    "api.pause_interpreter()\n"
    "some_python_code()\n"
    "api.pause_interpreter()\n";

static PyObject *pause_interpreter(PyObject *self, PyObject *args) 
    { 
    //irgendetwas um den Interpreter zu stoppen 
    //und den Zustand des Interpreters    zu sichern
    ??Py_pause_ienterpreter()??
		
    return NULL
    }

static PyMethodDef MethodTable[] = 
    { 
    {"pause_interpreter", pause_interpreter, METH_VARARGS, "pause_interpreter"}, 
    {NULL, NULL, 0, NULL} 
    };

int main()
{
	Py_Initialize(); 
	Py_InitModule("api", MethodTable);
        PyRun_SimpleString(program); 

        while (1){//mainloop
            
             //lass python laufen bis es sich selbst unterbricht
             ??PyRun_Continue_execution(program); 
            
             //mainlopp meiner c++ Anwendung
             my_old_cpp_code();
         }   
         Py_Finalize(); 
}

Habt Ihr eine Idee?

Danke Ruena
Zuletzt geändert von Anonymous am Samstag 10. Dezember 2011, 11:20, insgesamt 1-mal geändert.
Grund: Quelltext in C-Code-Tags gesetzt.
webskipper
User
Beiträge: 15
Registriert: Freitag 9. Dezember 2011, 19:11

Ich versuche gerade selbst, Python in C einzubetten.

Schaue dir mal PyRun_SimpleString() an, die Funktion könnte dir weiterhelfen.
ruena
User
Beiträge: 2
Registriert: Mittwoch 18. Mai 2011, 13:09

Kann ich dann auch Funktionen und Schleifen string für string ausführen?
webskipper
User
Beiträge: 15
Registriert: Freitag 9. Dezember 2011, 19:11

Ich weiss nicht, ob ich deine Frage richtig verstehe. Du musst zumindest ganze Anweisungsblöcke interpretieren lassen. Wobei dann die Frage im Raum ist, wie effizient das dann läuft.

Bsp.:

Code: Alles auswählen

#include <Python.h>

int main(int argc, char *argv[])
{

	Py_Initialize();

// Block 1
	PyRun_SimpleString(
	"def fakultaet(x):\n"
    "	if x > 1:\n"
    "		return x * fakultaet(x - 1)\n"
    "	else:\n"
    "		return 1\n"
	);
 
// Block 2
	PyRun_SimpleString("print fakultaet(20)\n");

// Block 3
	PyRun_SimpleString(
	"for i in range(1, 10):\n"
	"	print i\n"
	);

	Py_Finalize();
  
	return 0;
}
Ich habe gesehen du hast sie ja schon in deinem Code eingeführt. Was genau hast du denn vor und warum verzichtest du auf Threads bzw. Prozesskommunikation ?
Zuletzt geändert von Anonymous am Samstag 10. Dezember 2011, 11:22, insgesamt 1-mal geändert.
Grund: Quelltext in C-Code-Tags gesetzt.
deets

Die Loesung fuer dein Problem heisst Stackless Python, und wird zB von CCP bei EVE-Online benutzt.
Antworten