Zajímavé téma, dík za článek.
K ctypes: Na základě čeho předpokládá, že funkce má dva parametry typu int a spadne na příliš velkém argumentu?
U té druhé: Dají se ty hlavičky pro python nějak vygenerovat? int je jednoduchý, ale v případě složitějších typedef to může být náchylné na chyby či problémy s multiplatformností.
ctypes nemá žádné informace o tom, jakého typu mají být parametry. Proto jen předpokládá mapování mezi typy Pythonu a typy v céčku. V praxi to znamená, že vše bude na současných architekturách funkční pro malé inty v Pythonu, pro float, a pro řetězce (a do intů se pochopitelně řadí i True/False).
U ostatných typů parametrů dojde v nejlepším případě k běhové chybě (jak je ukázáno), v horším případě k předání "divné" hodnoty a v nejhorším případě bude vše jakoby funkční, ale v praxi se poruší zásobník (například pokud je funkce volána často nebo v určitém pořadí). I z tohoto důvodu není ctypes (podle mého názoru) vhodné řešení.
to jo, interop je peklíčko.
Ale zase zrovna Python->C je z tohoto pohledu ještě docela rozumné. Protože samotné C nemá v runtime žádné šílenosti typu GC (Python->Go je horší!) a i datové typy jsou +- v pohodě, pokud to opět nejsou nějaké ukazatele na callback funkce atd. A na rozdíl od C++ si nehrajeme na name mangling :)
Navíc není nutné řešit stuby ani na jedné straně (zdravíme JNI) :-p