2011-11-30 8 views
4

J'écris un module python en C, et je cherche un moyen d'écrire un module à l'intérieur d'un module.python c api pour créer un module python

PyMODINIT_FUNC 
initA(void) 
{ 
PyObject* pMod, pSubMod; 
pMod = Py_InitModule3("A", A_Methods, A_Doc); 
pSubMod = PyModule_New("B"); 
PyModule_AddStringConstant(pSubMod, "__doc__", B_Doc); 
PyModule_AddIntConstant(pSubMod, "SOMETHING", 10); 
PyModule_AddObject(pMod, "B", pSubMod); 
... and so on ... 

Après la compilation, je suis en train d'accéder au module et sa constante via diverses méthodes d'importation

>>> import A 
>>> print A.B.SOMETHING 
10 
>>> from A import B 
>>> print B.SOMETHING 
10 
>>> from A.B import * 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ImportError: No module named B 

deux premiers son raisonnable, et fonctionnent très bien. Cependant, le dernier ne fonctionne pas. Je m'attends à ce que je devrais avoir un code équivalent à __init__.py. Cependant, je ne veux pas écrire un fichier .py distinct; Je veux plutôt avoir un tel code dans la fonction C init directement. Pour référence, je joins les codes __dict__ et __all__ des deux modules.

>>> A.__dict__ 
{'B': <module 'B' (built-in)>, '__package__': None, '__file__': 'A.so'} 
>>> A.B.__dict__ 
{'SOMETHING': 10, '__package__': None, '__name__': 'B', '__doc__': 'B_Doc'} 
>>> A.__all__ 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
AttributeError: 'module' object has no attribute '__all__' 
>>> A.B.__all__ 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
AttributeError: 'module' object has no attribute '__all__' 

Merci,

Répondre

4

Vous avez pas réellement créé un module importable appelé A.B, puisque A n'est pas un paquet. Vous ne pouvez pas créer de paquets en C, seulement des modules; Les paquets sont définis par le système de fichiers (ou par un autre chargeur, mais cela ne serait pas pertinent ici).