Ušetřete

Hlavní navigace

Názory k článku
Vytváříme v C/C++ modul pro Python

Biktop
Biktop (neregistrovaný) ---.28.broadband3.iol.cz
3. 11. 2009 0:35 Nový

Re: Vytváříme v C/C++ modul pro Python

celé vlákno

„Python je velmi oblíbený jazyk hlavně díky jeho jednoduchosti, tedy díky tomu, že je interpretovaný.“

I interpretovaný jazyk může být komplikovaný, i kompilovaný jazyk může být jednoduchý.

„sám o sobě je Python rychlík oproti jiným interpretovanými jazyky“

Oproti kterým např.? Oproti kupř. Forthu je to podchlazený šnek. ;-)

Pavel Lang aura:56
3. 11. 2009 1:36 Nový

Re: Vytváříme v C/C++ modul pro Python

celé vlákno

Python je velmi oblíbený jazyk hlavně díky jeho jednoduchosti, tedy díky tomu, že je interpretovaný.
Nesmyslná věta, beru to jako omáčku, kdo zná Python, ví jaký a o čem je ;-)
Zkušenost je taková, že i sebevíce líné a interpretované či „polokompilované“ jazyky jsou dostatečně rychlé, samozřejmě s pílí pilovaným assemblerovým kódem nelze srovnávat. Co se týče web aplikací – PHP, Java, .NET (C#, VBasic a všechno další co jsem ještě neviděl), Ruby a nevím co se ještě používá na webové aplikace je rozhodně pomalejší než čistý C/C++ program (taky jak kdy ;-) ). S Forthem zkušenost nemám, stejně tak jako nemám plnohodnotné zážitky s LISPem, SmallTalkem a ostatními jazyky, ale např. Inkscape, které je psané v Pythonu jde docela dobře používat a že by bylo pomalé se mi nezdá, takže to je zase jen otázka správného návrhu, implementace a nedělání z toho to co to není. Stejně tak jako ostatní interpretované jazyky je Python použitelný na tvorbu bohatých aplikací byť webových tak desktopových a některými svými vlastnostmi a konstrukty ho lze použít i na sice ne nejefektivnější, ale přesto dostatečně rychlé a elegantní řešení úlohy. LINQ v .NET je oproti Pythonu hnůj.

Kakihara
Kakihara (neregistrovaný) ---.i4g.tmcz.cz
3. 11. 2009 2:45 Nový

Re: Vytváříme v C/C++ modul pro Python

celé vlákno

inkscape je napsane v c++, nikoliv v pythonu

dc
dc (neregistrovaný) ---.mcrn.sk
3. 11. 2009 9:23 Nový

Re: Vytváříme v C/C++ modul pro Python

celé vlákno

celkovo pouzivat v kompilovanej aplikacii na pluginy nejaky skriptovaci jazyk je hnoj.K comu su potom dynamicke kniznice a dobry navrh pluginov? A ked uz tak asi najrychlejsia je Lua (zo skriptovacich jazykov).

Inkvizitor
Inkvizitor (neregistrovaný) ---.net.upc.cz
3. 11. 2009 9:56 Nový

Re: Vytváříme v C/C++ modul pro Python

celé vlákno

Naopak, plugin ve skriptovacím jazyce si stáhnu a jedu. Žádné trapné kompilování pro každou platformu zvlášť. Pokud máš konkrétní poznatky o tom, že pluginy pro Inkscape jsou pomalé, sem s nimi.

Pavel Lang aura:56
3. 11. 2009 11:58 Nový

Re: Vytváříme v C/C++ modul pro Python

celé vlákno

Aha, teď na to koukám, nevím, proč jsem žil v domění, že Inkscape je v Pythonu, zkutečně je v C++

mpro
mpro (neregistrovaný) ---.sepsas.sk
3. 11. 2009 16:55 Nový

Re: Vytváříme v C/C++ modul pro Python

celé vlákno

Pravdepodobne zamena s programom Skencil (predtym to malo nazov Sketch) http://www.skencil.org

Ondřej Tůma aura:86
21. 1. 2010 18:24 Nový

Re: Vytváříme v C/C++ modul pro Python

celé vlákno

Pokud mate na mysli graficky vektorovy editor Inkscape, tak ten je psan v c++ (gtkmm).

Co se ale python bindingu tyce, tak ten se v praxi dela ze dvou pripadu:
- dotycna uloha(fce) by byla opravdu v pythonu pomala, nebo spatne programovatelna
- mame jiz hotovou komponentu, a chceme ji dostat do pythonu

Forseti
Forseti (neregistrovaný) ---.222.broadband7.iol.cz
25. 12. 2009 19:38 Nový

Re: Vytváříme v C/C++ modul pro Python

celé vlákno

I Blender 2.5 využívá hodně python a jede svižně.

Pavel Lang aura:56
3. 11. 2009 1:06 Nový

Re: Vytváříme v C/C++ modul pro Python

celé vlákno
Pěkné, tročku čeština by mohla „jít líp“, ale stranou a pár dotazů:
  • PyDoc_STRVAR( calc__doc__, "calc" ); a další PyDoc_STRVAR  – to je makro?
  • METH_VARARGS asi nebude jediný možný způsob sdělení jak předat argumenty, existuje i jiný? Respektive jak předat kwargs, alespoň to by se pro začátek docela hodilo, když ne víc
  • je docstring povinný? dá se předat bez potíží NULL nebo ukončit pole?
  • o jakou verzi Pythonu se zde jedná? Jde pouze o trojku nebo lze aplikovat i např. na 2.6?
  • Existuje jiná forma importu funkcí C knihoven do Pythonu než pomocí wraperů? (třeba jestli lze zavolat printf přímo z Pythonu..) Chápu, že článek navádí, jak psát moduly přímo pro Python v C, ale nezmiňuje se o alternativě
Díky za odpovědi.
Článek zajímavý nicméně se mi zdá nějak narychlo napsaný, ale každopádně díky za něj, sám mám Python rád, ale zatím jsem neměl potřebu psát si modul v C/C++, knihoven které lze naimportovat je dost a zatím stačily
volca
volca (neregistrovaný) 93.90.162.---
3. 11. 2009 8:58 Nový

Re: Vytváříme v C/C++ modul pro Python

celé vlákno

Pokusim se odpovedet:
* je to makro. Staci pohodlne pouzivat const char*, obcas ale byvaji problemy s tim ze python ceka holy char* (t.j. pak je treba hnusny const_cast, neb novejsi gcc dela string constants const)
* METH_VARARGS neni jediny. Existuji jeste METH_NOARGS, METH_KEYWORDS (Funkce potom musi byt typu PyCFunctionWit­hKeywords)
* docstring neni povinny, ale pokud chcete generovat dokumentaci k API, hodi se (napr. epydoc je uziva)
* Neslysel jsem o primem napojeni pythonu a C, ale existuji alternativy, napriklad hojne pouzivany Boost::Python (coz je defakto jenom sada sablon)

mimi.vx
mimi.vx (neregistrovaný) 94.74.251.---
3. 11. 2009 12:02 Nový

Re: Vytváříme v C/C++ modul pro Python

celé vlákno

plus existuje jeste pyrex a cython …

Jakub Matys
Jakub Matys (neregistrovaný) ---.lcs.cz
3. 11. 2009 9:30 Nový

Re: Vytváříme v C/C++ modul pro Python

celé vlákno

Od verze 2.5 je v Pythonu knihovna ctypes. Podle dokumentace my měla umožňovat spouštět Cčkovské funkce. Zatím jsem ji však prakticky nezkoušel.

http://docs.python.org/…/ctypes.html#…

Michal Hořejšek aura:100

Re: Vytváříme v C/C++ modul pro Python

celé vlákno

1) Ano, PyDoc_STRVAR je makro.
2) Ano, existuje více způsobů. Podívejte se do dokumentace. Naleznete například METH_KEYWORDS, METH_NOARGS, ..
3) Dokumentační řetězec můžeme úplně vynechat, je to nepovinný. Tedy například stačí { "minus", py_minus, METH_VARARGS }. Já si však myslím, že je dobré psát alespoň základní dokumentaci o funkci, a tím je její hlavička.
4) Tento příklad byl testován na 2.6. Pro Python 3 jsem to nezkoušel, vyzkouším.
5) Zda lze zavolat C funkce přímo v Pythonu nevím, nikde jsem se s tím nesetkal a podle mě to ani není možné.

Samozřejmě není potřeba si psát vlastní moduly v C/C++ (zvlášť tento příklad), ale pokud píšeme nějaký výpočtově náročný program a chceme dbát na rychlost, tak je velmi vhodné si napsat výpočet v C/C++.

Honza
Honza (neregistrovaný) 82.113.60.---
3. 11. 2009 8:40 Nový

koukam python ještě po 6 letech

Kdysi jsem něco podobného už na roota psal: http://www.root.cz/…-pro-python/
Ale naštěstí jsem od té doby 6 let na python nasáhnul a všechno jsem zapomněl.

volca
volca (neregistrovaný) 93.90.162.---
3. 11. 2009 9:02 Nový

drobne doplneni

celé vlákno

Myslim ze je slusnost v pripade ze nesedi parametry zavolat PyErr_SetString pred return NULL…

Tchap
Tchap (neregistrovaný) ---.47.114.115.adsl.nextra.cz
5. 11. 2009 1:55 Nový

Re: drobne doplneni

celé vlákno

Zdravim,
vetsina fci v Python/C API hazi pri problemu vyjimku rovnou uvnitr a vraci jen NULL nebo neco ekvivalentniho. Kdyz se podivate do dokumentace, tak zjistite, ze toto dela i PyArg_Parse­Tuple(). Nastavovani vyjimky v okamziku, kdy uz tam jednu mate, se povazuje za dost velkou chybu…

Rivon
Rivon (neregistrovaný) ---.gypce.cz
3. 11. 2009 12:03 Nový

Nebo taky mnohem jednodušeji...

… použijeme SWIG nebo Boost.Python, které za nás wrapper kód napíšou a my pak jen zkompilujeme. Celou aplikaci při tom píšeme jako standardní C/C++ bez použítí jakýchkoliv PyObject a podobně.

Limit False aura:15
3. 11. 2009 12:04 Nový

SWIG

celé vlákno

Psat to takhle primo mi prijde hrozne neprehledne a nachylne na chyby v porovnani s pouzitim swigu. Se swigem odpadaji manualni konverze, parsovani argumentu a swig se umi vyporadat s pretizenymi funkcemi a sablonami (C++). Sice to chvili trva naucit se, ale pak se hodne casu usetri (a navic je mozne pozit knihovnu jak v pythonu, tak v C/C++).

Priklad pro C++, pro C by to bylo jeste jednodussi (jenom 20 radku kdyz nepocitam includy): http://www.pastebin.cz/25296
Header wrapovany tim swig scriptem: http://www.pastebin.cz/25300

andreeeeee
andreeeeee (neregistrovaný) ---.koleje.cuni.cz
3. 11. 2009 22:41 Nový

Re: SWIG

celé vlákno

pripadne SIP, ten je (hlavne v kombinacii s Qt) este lepsi snad… SWIG mi bol parkrat schopny vygenerovat 1MB binarky na jednu c++ triedu :))

tomas
tomas (neregistrovaný) ---.96.broadband10.iol.cz
3. 11. 2009 13:51 Nový

boost::python

celé vlákno

Slušelo by se aspoň uvést odkazy na různé způsoby, jak python obalit jednoduššeji. Pokud chce někdo obalit c++, tak boost::python to rozhodně zjednodušuje podstatně.

r
r (neregistrovaný) 213.151.217.---
4. 11. 2009 0:50 Nový

Re: boost::python

celé vlákno
Ondrej Certik
Ondrej Certik (neregistrovaný) ---.static.reno.nv.charter.com
8. 11. 2009 20:20 Nový

cython

Myslim ze jedna z nejlepsich moznosti je pouzit cython (cython.org). Umi udelat wrappery na C i C++, ale pritom to vygeneruje jednoduchy C soubor, takze je do toho videt, co se tam deje. Krome toho lze cython pouzit i primo, na urychleni kriticke casti kodu (v pythonu).

Zasílat nově přidané příspěvky e-mailem