Google Groups Home
Help | Sign in
C/Python - jak to się powinno robić?
There are currently too many topics in this group that display first. To make this topic appear first, remove this option from another topic.
There was an error processing your request. Please try again.
flag
  Messages 1 - 25 of 39 - Collapse all   Newer >
The group you are posting to is a Usenet group. Messages posted to this group will make your email address visible to anyone on the Internet.
Your reply message has not been sent.
Your post was successful
ethanak  
View profile
 More options Apr 30, 3:50 am
Newsgroups: pl.comp.lang.python
From: ethanak <sweetha...@buziaczek.pl>
Date: Wed, 30 Apr 2008 07:50:05 +0000 (UTC)
Local: Wed, Apr 30 2008 3:50 am
Subject: C/Python - jak to się powinno robić?
Witam.

Postanowiłem wreszcie napisać w pygtk coś więcej niż prosty dialog
(ambitne postanowienie, nie?) i zaraz na wstępie się zaciąłem.

Otóż "sercem" powstającego programiku jest pewna (moja prywatna)
biblioteka pisana w C. Coś w stylu:

struct mylib_conf *mylib_init(jakieś parametry);
char *mylib_funkcja(struct mylib_conf *conf,jakieś parametry);
void mylib_free(struct mylib_conf *conf);

przy czym tych "mylib_funkcja" jest oczywiście więcej.

Wszystko pięknie-ładnie, jak z Pythona do C parametry przekazać to się
już naumiałem, jak wyniki pobrać też tylko nie mam pojęcia co mam zrobić
z tym nieszczęsnym "conf". Jest to zupełnie prywatna struktura w
bibliotece, aplikacja nie powinna się jej zawartością interesować tylko
zapamiętać wskaźnik i bez wnikania w szczegóły przekazywać wywoływanym
funkcjom.

No i teraz pytanie: jak to ma wyglądać od strony Pythona, który o ile mi
wiadomo takowych "wskaźników" nie przewiduje?

W Iconie radziłem sobie naokoło (funkcja typu "init" zwracała string z
szesnastkowym zapisem adresu) ale nie wydaje mi się to specjalnie
szczęśliwym rozwiązaniem.

Aha, wszystko to działa na Linuksie, na chwilę obecną inne systemy mnie
nie interesują.

Jakaś idea? Najchętniej coś do podpatrzenia...

ethanak
--
mailto=window.atob('ZXRoYW5ha0Bwb2xpcC5jb20=');
http://www.blubuntu.polip.com/ - a jednak sie da :)


    Reply to author    Forward  
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Sulsa  
View profile
 More options Apr 30, 5:52 am
Newsgroups: pl.comp.lang.python
From: Sulsa <su...@dontmail.me>
Date: Wed, 30 Apr 2008 11:52:19 +0200
Local: Wed, Apr 30 2008 5:52 am
Subject: Re: C/Python - jak to się powinno robić?
On Wed, 30 Apr 2008 07:50:05 +0000 (UTC)

Jesli uzywam interfejsu z biblioteki Python.h to rzutuje taki wskaznik
na intigera i taki adres zapamietuje gdzies w pythonie, a w kodzie c
spowrotem na wskaznik -- nie jest to zbyt eleganckie ale dziala. Mozesz
tez poszukac czegos w bibliotece ctypes, napewno bedzie bardziej
profesjonalnie, a jeszcze lepiej uzyc Boost::Python, genialna
biblioteka! Taki przykladzik z boost python:

-----------  plik *.h----------------------
class PotentialFunctions
{
    protected:
        std::vector<std::vector<numbertype> > learning_set;        
        std::vector<int> labels;
        PotentialFunction *potf;
    public:        
        void learn(std::vector<std::vector<numbertype> >&,
std::vector<int>&); int calculateOutput(const
std::vector<numbertype>&); void setPotentialFunction
(PotentialFunction&);
        PotentialFunctions();        
        PotentialFunctions(const PotentialFunction&);
        virtual ~PotentialFunctions();

};

----------- plik *cpp interfejsu miedzy py a c++ ----------------------
deklaracja klasy:
        class_<PotentialFunctionsWrapper>("PotentialFunctions", init<>
()) .def(init<const PotentialFunctionWrapper&>())
        .def("calculateOutput",
&PotentialFunctionsWrapper::calculateOutput) .def("learn",
&PotentialFunctionsWrapper::learn);

i przykladowy kodzik wrappera:
int PotentialFunctionsWrapper::calculateOutput(list sample)
{
    int size = len(sample);
    std::vector<numbertype> vec(size);
    for (int n=0; n<size; ++n){
        vec[n] = extract<numbertype>(sample[n]);
    }

    return PotentialFunctions::calculateOutput(vec);

}

------------------------------------------------------------
Wszystkie obiekty obsluguje sie tak jak w pythonie
np.: jak masz pythonowy obiekt list to masz tez jego wszystkie metody:
insert, find, index, .....

    Reply to author    Forward  
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Sulsa  
View profile
 More options Apr 30, 5:54 am
Newsgroups: pl.comp.lang.python
From: Sulsa <su...@dontmail.me>
Date: Wed, 30 Apr 2008 11:54:26 +0200
Local: Wed, Apr 30 2008 5:54 am
Subject: Re: C/Python - jak to się powinno robić?
często kodu wrappera wogole nie trzeba pisac bo boost sam wymuzdzy jak
to zrobic np:

    class_<ExponentialPotentialFunctionWrapper,
bases<PotentialFunctionWrapper> >("ExponentialPotentialFunction",
init<numbertype>());

I mamy udostepniana klase c++ z konstruktorem(tylko z konstruktorem bo
wiecej nie potrzebowalem)

--


    Reply to author    Forward  
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
ethanak  
View profile
 More options Apr 30, 2:27 pm
Newsgroups: pl.comp.lang.python
From: ethanak <sweetha...@buziaczek.pl>
Date: Wed, 30 Apr 2008 18:27:25 +0000 (UTC)
Local: Wed, Apr 30 2008 2:27 pm
Subject: Re: C/Python - jak to się powinno robić?
Dnia Wed, 30 Apr 2008 11:52:19 +0200, Sulsa napisał(a):
[...]

> Jesli uzywam interfejsu z biblioteki Python.h to rzutuje taki wskaznik
> na intigera

Dobra, koniec dyskusji.

Znasz takie zdanie na "p"?

ethanak
--
mailto=window.atob('ZXRoYW5ha0Bwb2xpcC5jb20=');
http://www.blubuntu.polip.com/ - a jednak sie da :)


    Reply to author    Forward  
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Sulsa  
View profile
 More options Apr 30, 5:26 pm
Newsgroups: pl.comp.lang.python
From: Sulsa <su...@dontmail.me>
Date: Wed, 30 Apr 2008 23:26:39 +0200
Local: Wed, Apr 30 2008 5:26 pm
Subject: Re: C/Python - jak to się powinno robić?
On Wed, 30 Apr 2008 18:27:25 +0000 (UTC)

ethanak <sweetha...@buziaczek.pl> wrote:
> Dnia Wed, 30 Apr 2008 11:52:19 +0200, Sulsa napisał(a):
> [...]
> > Jesli uzywam interfejsu z biblioteki Python.h to rzutuje taki wskaznik
> > na intigera

> Dobra, koniec dyskusji.

> Znasz takie zdanie na "p"?

Zdania zaczynaja sie z wielkich liter, wiec na "p" nie znam.

    Reply to author    Forward  
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
ethanak  
View profile
 More options May 1, 11:22 am
Newsgroups: pl.comp.lang.python
From: ethanak <sweetha...@buziaczek.pl>
Date: Thu, 1 May 2008 15:22:44 +0000 (UTC)
Local: Thurs, May 1 2008 11:22 am
Subject: Re: C/Python - jak to się powinno robić?
Dnia Wed, 30 Apr 2008 23:26:39 +0200, Sulsa napisał(a):
[...]

> Zdania zaczynaja sie z wielkich liter, wiec na "p" nie znam.

A c++ i c to dwa różne języki, weź te se wbij do tego czegoś co masz
zamiast mózgu.

A zdanie się miało zaczynać od "pomyśl", ale fakt, dla Ciebie jako
nieprzyzwyczajonego może być zbyt trudne.

ethanak
PS. Czy to tylko ja mam takie wrażenie że ten pan powinien się znaleźć na
dnie KF-a?
--
mailto=window.atob('ZXRoYW5ha0Bwb2xpcC5jb20=');
http://www.blubuntu.polip.com/ - a jednak sie da :)


    Reply to author    Forward  
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Rob Wolfe  
View profile
 More options May 1, 12:57 pm
Newsgroups: pl.comp.lang.python
From: Rob Wolfe <r...@smsnet.pl>
Date: Thu, 01 May 2008 18:57:42 +0200
Local: Thurs, May 1 2008 12:57 pm
Subject: Re: C/Python - jak to się powinno robić?

Do takich zabaw dość przyjemny jest Cython [1] [2]. Generalnie pozwala
on w dość prosty sposób opakowywać biblioteki napisane w C.
Co do wskaźników, to zwykle przyjmuje się takie rozwiązanie,
iż struktury z C opakowywane są w klasy (a właściwie typy) Pythona
i dopiero nimi się posługujemy na poziomie Pythona.
Z poniższego przykładu powinieś się pokapować jak to działa.
Tu akurat opakowałem strukturę `dirent` z "dirent.h" typem `Directory`.

Czyli mamy taki prosty programik w C:

<code>
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>

int main()
{
    DIR* pdir;
    struct dirent* pdirent;

    pdir = opendir(".");
    pdirent = readdir(pdir);
    while (pdirent != NULL)
    {
        printf("%s\n", pdirent->d_name);
        pdirent = readdir(pdir);
    }
    closedir(pdir);
    return 0;

}

</code>

Aby analogicznie użyć struktury `dirent` i funcji `opendir`, `readdir`
i `closedir` z poziomu Pythona, możemy zrobić coś takiego:

<code>
# pydir.pyx

cdef extern from "sys/types.h":
    ctypedef unsigned long int __ino_t
    ctypedef long int __off_t

cdef extern from "dirent.h":
    ctypedef struct DIR

    cdef struct dirent:
        __ino_t d_ino
        __off_t d_off
        unsigned short int d_reclen
        unsigned char d_type
        char d_name[256]

    DIR* opendir(char* __name)
    dirent* readdir(DIR* __dirp)
    int closedir(DIR* __dirp)

cdef class Directory:
    cdef DIR* c_dir
    cdef dirent* c_dirent
    cdef object root

    def __init__(self, root):
        self.root = root
        self.init()

    cdef init(self):
        self.c_dir = opendir(self.root)
        self.c_dirent = readdir(self.c_dir)

    def __iter__(self):
        return self

    def __next__(self):
        if self.c_dirent != NULL:
            dname = self.c_dirent.d_name
            self.c_dirent = readdir(self.c_dir)
            return dname
        closedir(self.c_dir)
        raise StopIteration
</code>

Z pliku `pydir.pyx` tworzymy rozszerzenie `pydir.so` Pythona przy pomocy
distutils, czyli takiego pliku `setup.py`:

<code>
# setup.py

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext as build_pyx

setup(name="PyDir",
      ext_modules=[Extension('pydir', ['pydir.pyx'])],
      cmdclass = {'build_ext': build_pyx})
</code>

$ python setup.py build_ext -i

W bieżącym katalogu powinien się utworzyć moduł `pydir.so`,
który możemy używać tak:

<code>
# test_pydir.py

import pydir

def listdir(root):
    for dname in pydir.Directory(root):
        print dname

listdir('.')
</code>

Prawda, że proste? ;)

Cython ma swoje ograniczenia (np. nie obsługuje generatorów), ale w większości
przypadków (przynajmniej moich) się sprawdza.

[1] http://www.cython.org/
[2] http://wiki.cython.org/

RW


    Reply to author    Forward  
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Sulsa  
View profile
(2 users)  More options May 1, 1:34 pm
Newsgroups: pl.comp.lang.python
From: Sulsa <su...@dontmail.me>
Date: Thu, 1 May 2008 19:34:09 +0200
Local: Thurs, May 1 2008 1:34 pm
Subject: Re: C/Python - jak to się powinno robić?
On Thu, 1 May 2008 15:22:44 +0000 (UTC)

ethanak <sweetha...@buziaczek.pl> wrote:
> Dnia Wed, 30 Apr 2008 23:26:39 +0200, Sulsa napisał(a):
> [...]
> > Zdania zaczynaja sie z wielkich liter, wiec na "p" nie znam.

> A c++ i c to dwa różne języki, weź te se wbij do tego czegoś co masz
> zamiast mózgu.

Jakbys cos mial w tej pustej bani to bys wiedzial ze te jezyki maja
spora czesc wspolna i bez problemu mozna wymieniac miedzy kodem
napisanym w obu struktury danych oraz wywolywac funkcje

> A zdanie się miało zaczynać od "pomyśl", ale fakt, dla Ciebie jako
> nieprzyzwyczajonego może być zbyt trudne.

Fakt jakbys nie byl takim skonczonym idiota(mozesz spytac matki czy u
was to dziedziczne bo byc moze to nie twoja wina) to bys przestrzegal
chociaz najprostrze zasady gramatyki, takie o ktorych wie juz trzecio
klasista.

    Reply to author    Forward  
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
ethanak  
View profile
 More options May 2, 2:26 am
Newsgroups: pl.comp.lang.python
From: ethanak <sweetha...@buziaczek.pl>
Date: Fri, 2 May 2008 06:26:37 +0000 (UTC)
Local: Fri, May 2 2008 2:26 am
Subject: Re: C/Python - jak to się powinno robić?
Dnia Thu, 01 May 2008 18:57:42 +0200, Rob Wolfe napisał(a):

[...]

> Prawda, że proste? ;)

Prościutkie, dokładnie o to mi chodziło. Dzięki!

Troszkę mi to zmieniło koncepcję modułu, ale mam wrażenie że na bardziej
"pytoniasty" sposób :)

Idę czytać o cythonach i pyrexach.

ethanak
--
mailto=window.atob('ZXRoYW5ha0Bwb2xpcC5jb20=');
http://www.blubuntu.polip.com/ - a jednak sie da :)


    Reply to author    Forward  
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Rudy  
View profile
 More options May 2, 2:57 pm
Newsgroups: pl.comp.lang.python
From: Rudy <a.r.dabrowski.nos...@gmail.com>
Date: Fri, 02 May 2008 20:57:25 +0200
Local: Fri, May 2 2008 2:57 pm
Subject: Re: C/Python - jak to się powinno robić?

Sulsa wrote:
> Jakbys cos mial w tej pustej bani to bys wiedzial ze te jezyki maja
> spora czesc wspolna i bez problemu mozna wymieniac miedzy kodem
> napisanym w obu

Nom, szczególnie kod z C++ można wykorzystywać w C. No normalnie jak ulał
pasuje!

Pozdrawiam.


    Reply to author    Forward  
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Sulsa  
View profile
 More options May 2, 4:40 pm
Newsgroups: pl.comp.lang.python
From: Sulsa <su...@dontmail.me>
Date: Fri, 2 May 2008 22:40:58 +0200
Local: Fri, May 2 2008 4:40 pm
Subject: Re: C/Python - jak to się powinno robić?
On Fri, 02 May 2008 20:57:25 +0200

Rudy <a.r.dabrowski.nos...@gmail.com> wrote:
> Sulsa wrote:

> > Jakbys cos mial w tej pustej bani to bys wiedzial ze te jezyki maja
> > spora czesc wspolna i bez problemu mozna wymieniac miedzy kodem
> > napisanym w obu

> Nom, szczególnie kod z C++ można wykorzystywać w C. No normalnie jak ulał
> pasuje!

Jak nie masz zielonego pojecia o czym piszesz to chociaz zechciej uzyc
google zanim opowiesz na jakiegos posta. Podpowiem ci ze funkcje i
struktury mozna bezproblemu exportowac.

--


    Reply to author    Forward  
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Discussion subject changed to "C/Python - jak to się powinno robić" by Radomir &#39;The Sheep&#39; Dopieralski