2009-02-04 9 views
7

Mam moduł rozszerzający C dla Pythona i chcę go udostępnić dla Rubyists.Połączony moduł rozszerzający Python i Ruby

Źródło ma kilka modułów C, z których tylko jedna jest zależna od Pythona. Reszta zależy tylko od siebie i od standardowej biblioteki. Mogę go zbudować w zwykły sposób przy pomocy python setup.py build.

Eksperymentowałem z dodawaniem wsparcia dla Rubiego przy użyciu newgem i mogę zbudować wersję rozszerzenia z rake gem. Jednak połączone źródło ma nieprzyjemny układ katalogów (mieszanie stylów w stylu Gem i struktur typu Setuptools), a proces budowania jest kludge.

Nie mogę po prostu zachować wszystkich źródeł w tym samym katalogu, ponieważ mkmf automatycznie wybiera moduł zależny od Pythona i próbuje go skompilować, a użytkownicy nie powinni instalować Pythona, aby skompilować moduł, który nie będzie być użytym. Obecny hack jest dla extconf.rb, aby skopiować niezależne od Pythona pliki źródłowe do tego samego katalogu, co moduł rozszerzenia zależny od języka Ruby.

Czy istnieje lepszy sposób udostępnienia kodu obu językach? Czy powinienem po prostu powielić kod niezależny od Pythona w osobnym Klejnocie? Czy powinienem zwolnić niezależny kod jako osobną bibliotekę zbudowaną z autotoolami? Czy istnieje wersja mkmf, która może pominąć niepożądany moduł?

Odpowiedz

5

Jednym ze sposobów rozwiązania tego jest stworzenie trzech różnych projektów:

  • sama biblioteka, niezależne od pytona & rubinowym
  • Python wiązaniami
  • Ruby powiązań

to prawdopodobnie najczystsze rozwiązanie, choć wymaga trochę więcej pracy przy wydawaniu, ale ma tę zaletę, że możesz wypuścić nową wersję wiązań Ruby bez konieczność wysłania nowej wersji biblioteki/Pythona.

0

Uzupełnienie tego, co powiedział Johan, użyłem kilku bibliotek pomocniczych c/C++ w Pythonie dzięki swigowi. Piszesz swój kod w języku c/C++, a następnie tworzysz szablon pośredni dla każdego języka, który chcesz wspierać. Jest raczej bezbolesny dla Pythona, ale niektóre kwestie muszą być zrobione dla Ruby ... a mianowicie nie uważam, że wsparcie pthread jest szczęśliwe z rubinem lub odwrotnie.

http://www.swig.org/ Ma nieco stromą krzywą uczenia się, więc może najlepiej znaleźć przykładowy projekt pokazujący, jak używać otoki dla języków docelowych.

Jest to zdecydowanie przydatne narzędzie, ponieważ sprawia, że ​​kod jest dużo czystszy, a jednocześnie zapewnia solidne powiązania z wieloma językami (PHP, Python, Ruby, i uważam, że C#)