Python Interpreter und c++



  • Hey Leute,
    ich hab mal eine frage zur Nutzung vom Python Interpreter. Und zwar hab ich in meinem C++ code folgendes:

    void ExposDriver::RunDriver(ExposDriverModul *driver){
      //initalization of python interpreter
      Py_Initialize();
    
      //run python script
      PyRun_SimpleString(driver->getDriver());
    
      //close python interpreter
      Py_Finalize();
    }
    

    Nun würde ich gerne dem ausgeführten Python Script Daten mit übergeben. Also Daten von C++ in mein Python Script bekommen, um sie dort zu verarbeiten. Gibt es da eine Möglichkeit? Ich hab erst gedacht ich kann in meinem Python Script so etwas schreiben:

    import cache.h as c
    print c.test(5, 3)
    

    Aber import geht ja nur mit einer Lib. Wenn ich das richtig verstanden habe, kann der Interpreter nur das Python Scripte ausführen. Ich bin allerdings neu auf diesem Gebiet. Vielleicht hat ja jemand einen Tipp für mich. Benutzen tue ich Python 2.7 und bitte keine Boost Lösungen. 🙂

    P.S.: Falls doch in das Python Forum Verzeigung.



  • Eine Möglichkeit ist die Daten einfach in das PythonScript rein zu schreiben.

    PyRun_SimpleString(getDaten() + driver->getDriver());
    

    Eine andere ist sich mit pickle und unpickle auseinander zu setzen und die zu übergebenen Objekte per unpickle aus einer Datei zu holen. Das ist aber eher kompliziert. Du kannst auch die Daten als Pythonanweisung in eine Datei schreiben und dann per

    exec(datei.read());
    

    die Daten bekommen. Ist natürlich sicherheitstechnisch eine Katastrophe.



  • nwp3 schrieb:

    Eine Möglichkeit ist die Daten einfach in das PythonScript rein zu schreiben.

    PyRun_SimpleString(getDaten() + driver->getDriver());
    

    Eine andere ist sich mit pickle und unpickle auseinander zu setzen und die zu übergebenen Objekte per unpickle aus einer Datei zu holen. Das ist aber eher kompliziert. Du kannst auch die Daten als Pythonanweisung in eine Datei schreiben und dann per

    exec(datei.read());
    

    die Daten bekommen. Ist natürlich sicherheitstechnisch eine Katastrophe.

    Danke erst einmal für deine Antwort.
    Zu deiner ersten Variante:
    Wenn ich die Daten da einfach mit rein schreibe kann das Script diese dann benutzen? Kannst du mir das vielleicht noch einmal näher erläutern.

    Die anderen beiden Sachen lasse ich erstmal außen vor.

    Ich hab grade noch das hier gefunden. Das klingt nachdem was ich gesucht habe. Allerdings läuft das Beispiel noch nicht bei mir. 😃

    Bin für weitere Tipps dankbar.



  • Beispiel: Ich will die Daten [42, 1, 4, 2] an python übergeben

    #Pythoncode:
    for (i in daten): #daten ist nicht definiert
        tuwas(daten) #tuwas ist irgendwo definiert
    
    vector<int> daten = {42, 1, 4, 2};
    
    string pythoncode = "..."; //enthält den pythoncode von oben
    void pythonTuwas(const vector<int> &daten){
        string d = "daten = [";
        for (auto i : daten)
            d += to_string(*i) + ",";
        d.pop_back(); //letztes komma weg
        d += "]\n";
        PyRunScriptFromString(d + pythoncode); //hier bekommt der pythoncode die Daten vorgesetzt
    }
    

    Daten von python zurück zu C++ zu kriegen geht nicht so einfach, da muss man wohl mit Dateien/Sockets/SharedMemory hantieren



  • Im Prinzip kannst du doch von C++ auf alle Daten von Python zugreifen.
    Für mehr Komfort nimm aber doch Boost.Python

    Schreibe und Lese die Globals von Python.


Anmelden zum Antworten