python und c++



  • hi,

    wie gut kann man python code in c++ einbinden? boost::python unterstützt es ja...
    möchte die rs232 mit pySerial http://pyserial.sourceforge.net/ ansteuern und in c++ einbinden....kann es dabei probleme geben?

    bye



  • Möchtest du Python in ein C++-Programm einbinden, oder ein Python-Programm durch ein C++-Modul erweitern? Beides ist mit Boost.Python möglich, aber letzteres ist in aller Regel einfacher, und oft auch sinnvoller, aber das kommt natürlich auf den genauen Anwendungsfall an.

    Was die serielle Schnittstelle angeht mußt du halt gucken, daß dann auch alles über pySerial läuft. Solltest du irgendwo von C++ aus auf die serielle Schnittstelle zugreifen wollen, müßtest du halt erstmal eine Python-Funktion schreiben, die ihrerseits pySerial benutzt, und die du dann mit Boost.Python wrapst. Aber sonst sollte es da eigentlich keine Schwierigkeiten geben.



  • dooooomi schrieb:

    Was die serielle Schnittstelle angeht mußt du halt gucken, daß dann auch alles über pySerial läuft. Solltest du irgendwo von C++ aus auf die serielle Schnittstelle zugreifen wollen, müßtest du halt erstmal eine Python-Funktion schreiben, die ihrerseits pySerial benutzt, und die du dann mit Boost.Python wrapst.

    Das stimmt nicht. Du kannst ohne weiteres aus C++ heraus mit Boost.Python (aber etwas komplizierter auch mit der CPython-API) auf beliebige Pythonfunktionen zugreifen.

    bp::object pyserial = bp::import("pyserial");
    
    bp::object fancy_serial_func = pyserial.attr("fancy_serial_func");
    
    fancy_serial_func(0, 1, 2);
    

    Ändert natürlich nichts daran, dass man, wenn man Python nicht auch noch anderweitig sinnvoll benutzt besser auf die nativen APIs für serielle Schnittstellen zugreifen sollte (dabei ist der pyserial-Code natürlich extrem hilfreich).



  • .filmor schrieb:

    Das stimmt nicht. Du kannst ohne weiteres aus C++ heraus mit Boost.Python (aber etwas komplizierter auch mit der CPython-API) auf beliebige Pythonfunktionen zugreifen.

    Stimmt, hast natürlich Recht. Worauf ich eigentlich hinaus wollte ist, daß alles was mit der seriellen Schnittstelle zu tun hat dann (höchstwahrscheinlich) komplett über pySerial laufen muß.

    Aber am besten macht man sich natürlich von vornherein Gedanken über ein sauberes Design, so daß die Berührungspunkte zwischen der Python- und der C++-Welt möglichst klein sind.



  • boost::asio kann jetzt auch die serielle Schnittstelle ansprechen, kannst dir also python sparen 😉



  • xyzabcd schrieb:

    boost::asio kann jetzt auch die serielle Schnittstelle ansprechen, kannst dir also python sparen 😉

    Und Python kann sowieso alles, man könnte sich also auch einfach C++ sparen.

    Ups, falsches Forum 🙂



  • boost::asio kann jetzt auch die serielle Schnittstelle ansprechen

    wo steht das denn?


  • Administrator

    cpp1 schrieb:

    boost::asio kann jetzt auch die serielle Schnittstelle ansprechen

    wo steht das denn?

    Auf der Dokuseite:
    http://www.boost.org/doc/libs/1_37_0/doc/html/boost_asio/overview/serial_ports.html

    Und natürlich unter Referenz usw. usf. Einfach die Doku lesen 😉

    Grüssli



  • aber gar keine beispiele dabei;/ komisch...


  • Administrator

    cpp1 schrieb:

    aber gar keine beispiele dabei;/ komisch...

    Ja, der Autor hat gerade einiges anderes auf dem Plan. Das wird nun schon länger kritisiert, ist nicht nur bei der seriellen Schnittstelle das Problem, sondern auch beim ICMP.
    Es soll aber sobald wie möglich kommen. Diese Features kamen schliesslich erst mit 1.36 rein.

    Grüssli



  • ist der code denn getestet?

    lg


  • Administrator

    cpp1 schrieb:

    ist der code denn getestet?

    Ich nehme es schwer an. In Boost kommt normalerweise kein Code einfach so ungetestet rein. Um ehrlich zu sein, habe ich noch nie erlebt, dass in Boost irgendwo ein Bug drin war 😉

    Übrigens, nach kurzem Suchen, habe ich noch zwei Beispiele gefunden:
    http://sourceforge.net/project/shownotes.php?group_id=122478&release_id=610981 (sehr kurze Erklärung, aber könnte helfen)
    http://groups.google.cz/group/boost-list/browse_thread/thread/5cc7dcc7b90d41fc?hl=en (erweitertes Beispiel)

    Grüssli



  • dh auch diese serielle klasse kommt ins c++ tr2?

    bye



  • Hallo ihr!!
    Also ich habe ein kleines Problem mit meinem Programm. Ich möchte die Grafik in einer Schleife mehrfach wiederholen lassen und habe versucht 'for...in' dafür zu nutzen. Aber jetzt zeigt er mir beim ersten fill nach diesem Befehl einen Syntax error an..
    Hier ist mein Quelltext, ich hoffe ihr könnt mir helfen!
    lg

    from xturtle import*
    bgcolor("black")
    for i in range (
    color("yellow")
    fill (1)
    circle(50)
    fill(0)
    right(90)
    up( )
    forward(300)
    down ()
    color("grey")
    fill(1)
    left(90)
    forward (100)
    right(90)
    forward(30)
    right(90)
    forward(200)
    right (90)
    forward(30)
    right(90)
    forward(100)
    fill(0)
    left(90)
    up()
    forward(300)
    down()
    color("yellow")
    left(190)
    forward(302)
    right(10)
    forward(30)
    left(10)
    forward(50)
    )
    print i


  • Administrator

    cpp1 schrieb:

    dh auch diese serielle klasse kommt ins c++ tr2?

    Was in den TR2 kommt, ist noch nicht definiert. Das wurde verschoben auf die Zeit danach, wenn der neue Standard draussen ist. Wäre aber natürlich ziemlich praktisch 🙂

    Grüssli



  • hi,

    ich habe vor eine gui in python zu machen mit pyqt und den rest der appl. in c++.

    dachte nun das ich den python code mit pyqt über boost::python in mein c++ prog einbaue.

    Ich habe mir ein paar beispiel angesehen, warum kann man in folgende beispiel dann in python aufrufen? liefert der c++ compiler als output ein skript?

    namespace k3d
    {
    	class point3
    	{ 
    	public:
    		point3();
    		point3(double, double, double);
    		double x, y, z;
    	};
    }
    
    namespace k3d
    {
    	class vector3
    	{ 
    	public:
    		vector3();
    		vector3(double, double, double);
    		double x, y, z;
    	};
    }
    
    #include "point3.h"
    #include "vector3.h"
    #include <boost/python.hpp>
    using namespace boost::python;
    BOOST_PYTHON_MODULE(k3d)
    {
    	class_<k3d::point3>("point3")
    		.def(init<double, double, double>());
    	class_<k3d::vector3>("vector3")
    		.def(init<double, double, double>());
    }
    
    >>> import k3d
    >>> dir(k3d)
    ['__doc__', '__name__', 'point3', 'vector3']
    >>> p = k3d.point3(0, 1, 2)
    >>> print p
    <k3d.point3 object at 0xb7bb8b44>
    >>> v = k3d.vector3(1, 2, 3)
    >>> print v
    <k3d.vector3 object at 0xb7bb8b94>
    

    bye



  • kann man k3d nur via import ausführen?

    bye



  • cpp1 schrieb:

    liefert der c++ compiler als output ein skript?

    Es gibt ein C-API für Python-Erweiterungsmodule. Der Compiler liefert eine DLL, die dieses API verwendet, und dementsprechend von Python geladen werden kann.

    cpp1 schrieb:

    kann man k3d nur via import ausführen?

    In Python werden alle Module grundsätzlich per import geladen, also auch die in C/C++ geschriebenen Erweiterungen. Worauf willst du mit der Frage hinaus?



  • dooooomi schrieb:

    cpp1 schrieb:

    liefert der c++ compiler als output ein skript?

    Es gibt ein C-API für Python-Erweiterungsmodule. Der Compiler liefert eine DLL, die dieses API verwendet, und dementsprechend von Python geladen werden kann.

    du meinst diesen Boost.Python C++ Wrapper?

    cpp1 schrieb:

    kann man k3d nur via import ausführen?

    In Python werden alle Module grundsätzlich per import geladen, also auch die in C/C++ geschriebenen Erweiterungen. Worauf willst du mit der Frage hinaus?

    ja aber man kann ja auch den python interpreter in c++ einbinden...



  • cpp1 schrieb:

    dooooomi schrieb:

    Es gibt ein C-API für Python-Erweiterungsmodule. Der Compiler liefert eine DLL, die dieses API verwendet, und dementsprechend von Python geladen werden kann.

    du meinst diesen Boost.Python C++ Wrapper?

    Python selbst hat nur ein API in C (http://docs.python.org/c-api/), das von allen Erweiterungen (und dem Interpreter selbst) verwendet wird. Boost.Python vereinfacht das Ganze mit sehr viel C++-Template-Zauberei, aber "innendrin" wird auch dabei das C-API verwendet. Und das ist es, was der Python-Interpreter dann sieht, wenn er das Modul lädt.

    cpp1 schrieb:

    ja aber man kann ja auch den python interpreter in c++ einbinden...

    Kann man schon, ist aber i.d.R. aufwendiger, und macht in den meisten Fällen auch keinen Sinn. Wenn du eh die komplette GUI in Python schreiben willst, dann mach's auf jeden Fall andersrum.


Anmelden zum Antworten