Python Interpreter für C++ nutzen



  • hustbaer schrieb:

    Wenns einfach sein soll nimm LUA, das ist VIEL einfacher einzubinden als Python und muss vor allem nicht installiert werden (wird einfach zu deinem Programm dazugelinkt).

    Python wird auch nur dazugelinkt...

    Krux schrieb:

    LUA scheint recht interessant zu sein, aber nicht ganz dem zu entsprechen, was ich für mein Projekt haben möchte, LUA hat bytecode, und ich würde gerne über eine Konsole ein Programm steuern können. Da ich allerdings nicht selber so eine Konsole erstellen möchte, hab ich mir gedacht, wäre eine konsole, die mir zusätzlich auch noch die möglichketen von Python gibt sehr vorteilhaft. Geschwindigkeit ist mir erstmal nicht wichtig.

    Python ist ausreichend schnell. Ich mache zz sogar die Graphik meines Programms zu großen Teilen in Python (vorrangig zum Prototyping). Btw, um die Konsole toller zu machen, solltest du auf jeden Fall ipython verwenden.

    Krux schrieb:

    naja, am System herumfummeln, nur damit es einer Anwedung passt, das nenne ich Fortschlitt, aber das boosteigene build-System, möchte ich nicht noch lernen, da ich eine IDE und nicht blos ein Editor benutze, würde das viele Vorteile der IDE gleich wieder zu nichte machen.

    Da hast du mich völlig missverstanden. Ich meinte genau das, was rüdiger zuletzt vorgeschlagen hat. Und ich meinte auch, du solltest gerade /nicht/ Boost.Build für dein eigenes Programm verwenden. Boost baut man natürlich nur damit, oder besser mit dem zur Distribution gehörenden Paketmanager!



  • .filmor schrieb:

    hustbaer schrieb:

    Wenns einfach sein soll nimm LUA, das ist VIEL einfacher einzubinden als Python und muss vor allem nicht installiert werden (wird einfach zu deinem Programm dazugelinkt).

    Python wird auch nur dazugelinkt...

    Oha, sorry, ich wusste nicht dass das geht.
    Naja, ok, es geht wie ich gerade selbst festgestellt habe.

    Krux schrieb:

    LUA scheint recht interessant zu sein, aber nicht ganz dem zu entsprechen, was ich für mein Projekt haben möchte, LUA hat bytecode, und ich würde gerne über eine Konsole ein Programm steuern können. Da ich allerdings nicht selber so eine Konsole erstellen möchte, hab ich mir gedacht, wäre eine konsole, die mir zusätzlich auch noch die möglichketen von Python gibt sehr vorteilhaft. Geschwindigkeit ist mir erstmal nicht wichtig.

    Was du mit "LUA hat bytecode" meinst weiss ich nicht. LUA lässt sich mit Bytecode oder Text füttern, ganz nach belieben. Python generiert auch erstmal Bytecode und führt den dann aus. Ist in beiden Fällen aber transparent, sollte also egal sein. Ob man Python mit Bytecode direkt füttern kann weiss ich nicht, ist aber für dich eh nicht wichtig wenn ich dich richtig verstanden habe.

    ----

    Ich will dir Python aber natürlich nicht ausreden, dachte mir nur ich erwähne LUA mal weil ich LUA eben viel einfacher finde. Wenn LUA noch Integers hätte wäre ich fast schon glücklich damit 🙂



  • hustbaer schrieb:

    Was du mit "LUA hat bytecode" meinst weiss ich nicht. LUA lässt sich mit Bytecode oder Text füttern, ganz nach belieben. Python generiert auch erstmal Bytecode und führt den dann aus. Ist in beiden Fällen aber transparent, sollte also egal sein. Ob man Python mit Bytecode direkt füttern kann weiss ich nicht, ist aber für dich eh nicht wichtig wenn ich dich richtig verstanden habe.

    Ja so weit ich weiß, kann man ja zu Bytecode compilieren, dann müsste man es ja auch damit füttern können, aber wie gesagt, ich würde Python gerne als Konsole verwenden, da ist es für mich erst mal zweitrangig, ob sowas mglich ist. LUA hab ich wirklich nur ganz kurz überflogen, weil ich davon bisher noch absolut nichts gehört hatte.

    Ich will dir Python aber natürlich nicht ausreden, dachte mir nur ich erwähne LUA mal weil ich LUA eben viel einfacher finde. Wenn LUA noch Integers hätte wäre ich fast schon glücklich damit 🙂

    Wie soll man ohne integers Indizes ansprechen? Naja wird wohl irgendwie möglich sein.



  • Lua kann sowohl Sourcecode als auch Bytecode vearbeiten. Aber am Ende muß man das selber wissen was man nimmt, da beide Sprachen unterschiedlich sind und auch die Performance beachtliche Unterschiede aufweist.



  • Öhm, es geht wohl um die Konsole, da wirds wohl absolut und völlig unwichtig sein, ob man die mit Bytecode füttern kann 😉

    Btw, hier ein Minimalbeispiel:

    #include <boost/python.hpp>
    
    namespace bp = boost::python;
    
    const char* initial_program = 
        "import __main__, IPython\n"
        "IPython.Shell.IPShell(user_ns = __main__.__dict__).mainloop()\n";
    
    int main (int argc, char** argv)
    {
        try
        {
            Py_Initialize ();
            PySys_SetArgv (argc, argv); // setzt sys.argv
    
            bp::object global = bp::import ("__main__").attr ("__dict__");
    
            {
                bp::scope s (global);
                // hier Funktionen aufrufen, die class_, def etc. ausführen (*)
            }
    
            bp::exec (initial_program, global, global);
        }
        catch (boost::python::error_already_set const&)
        {
            PyErr_Print ();
        }
        Py_Finalize ();
    }
    

    Du kannst das eigentliche Programm, das hier in initial_program als C-String vorliegt natürlich auch mit den Boost.Python-Mitteln implementieren, aber der Aufwand ist imho nicht gerechtfertigt.

    zu (*): Du kannst hier, wenn du BOOST_PYTHON_MODULE verwendet hast die entsprechende init_module_<Modulname>-Funktion aufrufen, die das Makro automatisch anlegt.



  • Krux schrieb:

    Ich will dir Python aber natürlich nicht ausreden, dachte mir nur ich erwähne LUA mal weil ich LUA eben viel einfacher finde. Wenn LUA noch Integers hätte wäre ich fast schon glücklich damit 🙂

    Wie soll man ohne integers Indizes ansprechen? Naja wird wohl irgendwie möglich sein.

    Naja, double ist ja "integer clean" sozusagen. Also wenn du 1.0 reinsteckst, dann + 1.0 rechnest und dann == 2.0 prüfst, dann geht das schon. Da LUA sowieso nur assoziative "Tables" kennt geht das auch mit double. Ist aber IMHO greislich hässlich.



  • ok hab nach einer kleinen pause mich jetzt noch mal dazu aufgerafft, hier weiter zu machen. Also kompilieren kann ich jetzt, aber von dem tutorial her ist mir noch schleierhaft, wie ich das ganze eigentlich überhaupt unter linux kompilieren soll, denn im Tutorial steht nur etwas von einer DLL, und die gibts unter linux nicht. Ich habs als Dynamic Library Kompiliert. Wenn ich jetzt allerdings versuche das ganze in python zu testen, kkommt folgender Fehler:

    import libpythontest
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ImportError: ./libpythontest.so: undefined symbol: _ZN5boost6python6detail11init_moduleEPKcPFvvE
    




  • Natürlich gibt es unter Linux DLLs. Die haben zwar ELF und nicht PE als Dateiformat und enden auf .so, aber dennoch existieren sie. Leg vielleicht mal die erstellte libboost_python.so in das Arbeitsverzeichnis.



  • .filmor schrieb:

    Leg vielleicht mal die erstellte libboost_python.so in das Arbeitsverzeichnis.

    NEEEEEIN!!! So was macht man über die Umgebungsvariable LD_CONFIG_PATH


Anmelden zum Antworten