Różnice między wybraną wersją a wersją aktualną.
Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
boost_python [2008/04/14 20:17] kamituel |
boost_python [2008/04/16 07:16] kamituel |
||
---|---|---|---|
Linia 1: | Linia 1: | ||
====== Biblioteka Boost Python ====== | ====== Biblioteka Boost Python ====== | ||
Kamil Leszczuk, G1SST | Kamil Leszczuk, G1SST | ||
+ | |||
+ | ==== Wstęp ==== | ||
Biblioteka Boost Python umożliwia korzystanie z kodu napisanego w C++ z poziomu skryptów Pythona. | Biblioteka Boost Python umożliwia korzystanie z kodu napisanego w C++ z poziomu skryptów Pythona. | ||
Do dyspozycji mamy nie tylko proste funkcje, ale także całe klasy (i ich hierarchie) czy metody klas - wraz z tymi wirtualnymi. | Do dyspozycji mamy nie tylko proste funkcje, ale także całe klasy (i ich hierarchie) czy metody klas - wraz z tymi wirtualnymi. | ||
+ | Wykorzystać można także przeciążone operatory czy pola tylko do odczytu. | ||
+ | \\ Biblioteka Boost Python jest wygodnym narzędziem także ze względu na prostotę swojego interfejsu - zdecydowana większość kodu C++ ma duże szanse współpracować z tą bilblioteką out-of-box, bez niespodzianek i problemów. | ||
==== Wymagania ==== | ==== Wymagania ==== | ||
Linia 10: | Linia 14: | ||
Aby rozpocząć pracę z bibliotekami boost::python należy posiadać w systemie (oprócz kompilatora oczywiście): | Aby rozpocząć pracę z bibliotekami boost::python należy posiadać w systemie (oprócz kompilatora oczywiście): | ||
* Interpreter Pythona | * Interpreter Pythona | ||
- | * Pakiet //devel// Pythona (pliki nagłówkowe) | + | * Pakiet //devel// Pythona - pliki nagłówkowe (jeśli nie zostały dostarczone wraz z instalacją Pythona) |
* Biblioteki boost | * Biblioteki boost | ||
Linia 28: | Linia 32: | ||
BOOST_PYTHON_MODULE(p1) { | BOOST_PYTHON_MODULE(p1) { | ||
- | def("skomplikowany_algorytm", &potega); | + | .def("skomplikowany_algorytm", &potega); |
} | } | ||
</code> | </code> | ||
Linia 45: | Linia 49: | ||
<code python> | <code python> | ||
+ | #!/usr/bin/python | ||
import p1 | import p1 | ||
Linia 96: | Linia 101: | ||
virtual void metoda ( std::string suffix ) { | virtual void metoda ( std::string suffix ) { | ||
this->get_override("metoda")(); | this->get_override("metoda")(); | ||
+ | // Dla kompilatora MSVC należy zamienić powyższą linijkę na: | ||
+ | // this->get_override("metoda").ptr(); | ||
} | } | ||
}; | }; | ||
Linia 123: | Linia 130: | ||
I w końcu - zwróćmy uwagę na brak definicji metody ''metoda'' - jako że nasza klasa dziedziczy po ''Costam_0'', i w tamtej klasie tę metodę udostępniliśmy, teraz już nie musimy tego robić.\\ | I w końcu - zwróćmy uwagę na brak definicji metody ''metoda'' - jako że nasza klasa dziedziczy po ''Costam_0'', i w tamtej klasie tę metodę udostępniliśmy, teraz już nie musimy tego robić.\\ | ||
- | Ostatnia z klas udostępniona może być w ten sposób: | + | Ostatnia z klas udostępniona może być w taki sposób: |
<code cpp> | <code cpp> | ||
class_<Costam_B, bases<Costam_A> >("CostamB", init<std::string>()) | class_<Costam_B, bases<Costam_A> >("CostamB", init<std::string>()) | ||
Linia 193: | Linia 200: | ||
* Mamy dostęp do biblioteki C++, ale nie mamy do niej źródeł | * Mamy dostęp do biblioteki C++, ale nie mamy do niej źródeł | ||
W tym ostatnim przypadku jedyne co nam będzie potrzebne to pliki nagłówkowe tej bilioteki i parę minut czasu. | W tym ostatnim przypadku jedyne co nam będzie potrzebne to pliki nagłówkowe tej bilioteki i parę minut czasu. | ||
- | Weźmy klasy z poprzedniego przykładu, rozdzielmy je na plik nagłówkowy i źródłowy. Źródłowy skompilujmy do postaci biblioteki współdzielonej: | + | Weźmy klasy z poprzedniego przykładu, rozdzielmy je na plik nagłówkowy i źródłowy. |
+ | |||
+ | Plik nagłówkowy wyglądać może tak: | ||
+ | <code cpp> | ||
+ | class Costam_0 { | ||
+ | public: | ||
+ | virtual void metoda ( std::string suffix ) = 0; | ||
+ | virtual ~Costam_0 (); | ||
+ | }; | ||
+ | |||
+ | class Costam_A : public Costam_0 { | ||
+ | public: | ||
+ | Costam_A(); | ||
+ | Costam_A( std::string nazwa ); | ||
+ | virtual void metoda ( std::string suffix ); | ||
+ | std::string daj_nazwe () const; | ||
+ | void ustaw_nazwe ( const std::string nazwa ); | ||
+ | protected: | ||
+ | std::string nazwa_; | ||
+ | }; | ||
+ | |||
+ | class Costam_B : public Costam_A { | ||
+ | public: | ||
+ | Costam_B(); | ||
+ | Costam_B( std::string nazwa ); | ||
+ | virtual void metoda ( std::string suffix ); | ||
+ | Costam_B& operator+ ( std::string x ); | ||
+ | |||
+ | std::string x_; | ||
+ | }; | ||
+ | </code> | ||
+ | |||
+ | Plik źródłowy skompilujmy do postaci biblioteki współdzielonej: | ||
<code> | <code> | ||
$ g++ -Wall -shared p2-shared.cpp -o p2-shared.o | $ g++ -Wall -shared p2-shared.cpp -o p2-shared.o | ||
Linia 227: | Linia 266: | ||
} | } | ||
</code> | </code> | ||
- | i skompilujmy go **nie zapominając** o linkowaniu z naszą biblioteką ''p3-shared.o'': | + | i skompilujmy go **nie zapominając** o linkowaniu z naszą biblioteką ''p2-shared.o'': |
<code> | <code> | ||
g++ -Wall -shared -I/usr/include/boost/ -I/usr/include/python2.5/ /usr/lib/libboost_python-mt.so p2-shared.o p2.cpp -o p2.so | g++ -Wall -shared -I/usr/include/boost/ -I/usr/include/python2.5/ /usr/lib/libboost_python-mt.so p2-shared.o p2.cpp -o p2.so | ||
</code> | </code> | ||
I gotowe! Możemy teraz uruchomić skrypt z poprzedniego przykładu. A to wszystko bez dostępu do plików źródłowych! | I gotowe! Możemy teraz uruchomić skrypt z poprzedniego przykładu. A to wszystko bez dostępu do plików źródłowych! | ||
+ | \\ (w rzeczywistej sytuacji plik p2-shared.o byłby biblioteką której źródeł nie mamy - jak widać nawet pomimo tego udało się wystawić ją jako moduł Pythona) | ||
+ | |||
+ | ==== Więcej informacji ==== | ||
+ | |||
+ | * [[http://www.boost.org/libs/python|Witryna biblioteki]] | ||
+ | * [[http://wiki.python.org/moin/boost.python|Wiki na stronie pythona]] | ||
+ |