Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

boost::python

3 views
Skip to first unread message

Piotr Husiatyński

unread,
May 13, 2008, 4:24:54 AM5/13/08
to
Stworzyłem parę modułów w C++, które zaimportowałem w Pythonie jako
biblioteki. Jestem naprawdę pod dużym wrażeniem tego co oferuje ta
biblioteka, ale zastanawia mnie sposób w jaki ona działa.

Tworzę przykładową biblioteke hello.so i testuję działanie:
-------------------------------------------------------------------
#include <boost/python.hpp>

int test(int i)
{
return i;
}

BOOST_PYTHON_MODULE(hello)
{
using namespace boost::python;
def("test", test);
}
-------------------------------------------------------------------
>>> import hello
>>> hello.test(5)
5
>>> hello.test("bla")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
Boost.Python.ArgumentError: Python argument types in
hello.test(str)
did not match C++ signature:
test(int)
-------------------------------------------------------------------

Z tego co wypisuje error, podany został niewłaściwy typ danych. Mimo
że jest to poprawne, zastanawia mnie, jak dokładnie działa ten moduł.
Python nie sprawdza nigdy jakiego typu są argumenty. Więc jedyne co mi
się nasuwa na myśl to to, że wszystkie polecenia wykonywane na
bibliotece hello, obsługiwane są w C++. Więc tak naprawdę to Python,
podczas działania programu, tłumaczony jest do C++, a nie C++ do
Pytona.

Rob Wolfe

unread,
May 13, 2008, 6:22:06 AM5/13/08
to

Piotr Husiatyński napisał(a):
> Stworzylem pare modulow w C++, ktore zaimportowalem w Pythonie jako
> biblioteki. Jestem naprawde pod duzym wrazeniem tego co oferuje ta
> biblioteka, ale zastanawia mnie sposob w jaki ona dziala.
>
> Tworze przykladowa biblioteke hello.so i testuje dzialanie:


> -------------------------------------------------------------------
> #include <boost/python.hpp>
>
> int test(int i)
> {
> return i;
> }
>
> BOOST_PYTHON_MODULE(hello)
> {
> using namespace boost::python;
> def("test", test);
> }
> -------------------------------------------------------------------
> >>> import hello
> >>> hello.test(5)
> 5
> >>> hello.test("bla")
> Traceback (most recent call last):
> File "<stdin>", line 1, in <module>
> Boost.Python.ArgumentError: Python argument types in
> hello.test(str)
> did not match C++ signature:
> test(int)
> -------------------------------------------------------------------
>

> Z tego co wypisuje error, podany zostal niewlasciwy typ danych. Mimo
> ze jest to poprawne, zastanawia mnie, jak dokladnie dziala ten modul.
> Python nie sprawdza nigdy jakiego typu sa argumenty. Wiec jedyne co mi

Z tym bym nie przesadzal:
>>> import socket
>>> socket.ntohl('a')


Traceback (most recent call last):
File "<stdin>", line 1, in <module>

TypeError: expected int/long, str found

Python czasem tez sprawdza argumenty tylko przewaznie pod nieco innym
katem.

> sie nasuwa na mysl to to, ze wszystkie polecenia wykonywane na
> bibliotece hello, obslugiwane sa w C++. Wiec tak naprawde to Python,
> podczas dzialania programu, tlumaczony jest do C++, a nie C++ do
> Pytona.

Pokazales rozszerzenie Pythona napisane w C++, a nie rozszerzenie C++
napisane w Pythonie. Na styku Python/C jest PyObject, ale pozniej
musi nastapic translacja do typow C, aby dalej mozna bylo cos
z tym zrobic.

RW

Sulsa

unread,
May 13, 2008, 6:24:29 AM5/13/08
to
On Tue, 13 May 2008 01:24:54 -0700 (PDT)
Piotr Husiatyński <PHusia...@gmail.com> wrote:


> Z tego co wypisuje error, podany został niewłaściwy typ danych. Mimo
> że jest to poprawne, zastanawia mnie, jak dokładnie działa ten moduł.
> Python nie sprawdza nigdy jakiego typu są argumenty. Więc jedyne co mi
> się nasuwa na myśl to to, że wszystkie polecenia wykonywane na
> bibliotece hello, obsługiwane są w C++. Więc tak naprawdę to Python,
> podczas działania programu, tłumaczony jest do C++, a nie C++ do
> Pytona.
>

Rozszerzenia c/c++ kompilowane sa do kodu binarnego i pyton odwoluje
sie do funkcji siedzacych w tej bibliotece, sprawdzanie typu nastepuje
w bibliotece za pomocą funkcji PyInt_Check i jesli jest cos nie tak to
biblioteka rzuca wyjatkiem.

--

0 new messages