[Python] Python C API Creare delle variabili

Daniele Varrazzo piro a develer.com
Mar 12 Gen 2010 04:32:58 CET


On Tue, 12 Jan 2010 00:35:43 +0100, Alessandro Agosto
<the.6one6 a gmail.com>
wrote:
> Buona sera a tutti,
> sto usando -e studiando- le api di python per creare moduli in C. Devo
> ammettere di essere sorpreso dalla semplicitā di quest'ultime č (quasi)
> piacevole programmarci quanto usare puro python :)

Oddio... un pelino masochistico! Non č meglio lasciar fare il refcount a
qualcosa tipo pyrex?

> Attualmente volevo provare a rendere disponibile delle variabili del
> modulo,
> pertanto supponendo che il modulo si chiami "pymod" oltre alle varie
> funzioni vorrei rendere disponibile qualche variabile direttamente da C.
> Dando un occhio alla documentazione ho trovato PyModule_AddObject (
> http://docs.python.org/c-api/module.html#PyModule_AddObject) e credo di
> essere sulla buona strada... il problema č che come primo parametro
questa
> accetta un oggetto di tipo modulo e non mi č chiaro come usarla senza
> dover
> creare un nuovo modulo (con PyModule_New()).
> Magari ho anche sbagliato del tutto, ma in qualunque caso, qualcuno sā
> come
> posso/devo procedere?
> Ps. mi č noto l'uso di Py_BuildValue ma creando un valore non vedo il
modo
> di rendere noto l'oggetto a cui ne assegno il valore costruito (infatti
lo
> uso nelle funzioni).

La documentazione di PyModule_AddObject sembra suggerire che devi
passargli il risultato della funzione Py_InitModule [1] o analoghe. Questo
va fatto nella funzione di inizializzazione del modulo (initpymod nel tuo
caso).

Io comunque non ho mai usato PyModule_AddObject: per un esempio puoi
vedere questo semplice (2 funzioni e una costante stringa) modulo di
estensione [2]: il codice della initXXX() usa:

- Py_InitModule4 per creare il modulo
- PyModule_GetDict per ottenere il dizionario del modulo
- PyDict_SetItemString per aggiungere oggetti al dizionario del modulo.

Lo scheletro di questo modulo l'ho creato usando un tool mezzo abbandonato
che si trova nella distribuzione sorgente di Python: Tools/modulator. Ha un
po' di bit rot ma ce l'ha fatta a produrre uno scheletro che poi ho finito
a mano.

Comunque appena serve qualcosa un pelino pių complessa ti sconsiglio di
procedere a mano con l'API C nuda e cruda e ti consiglio invece
Pyrex/Cython.

[1] http://docs.python.org/c-api/allocation.html#Py_InitModule
[2]
http://code.google.com/p/py-setproctitle/source/browse/src/setproctitle.c

-- 
Daniele Varrazzo - Develer S.r.l. 
http://www.develer.com


Maggiori informazioni sulla lista Python