2011-11-30 105 views
4

我正在用C編寫一個python模塊,並尋找一種在模塊內部編寫模塊的方法。python c api創建一個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 ... 

編譯後,我試圖通過各種導入方法

>>> 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 

首先兩個聲音合理,做工精細訪問模塊及其常量。但是,最後一個不起作用。我期待我應該有一個相當於__init__.py腳本的代碼。但是,我不想編寫一個單獨的.py文件;而是我想直接在C init函數中擁有這樣的代碼。

作爲參考,我附上__dict____all__這兩個模塊。

>>> 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__' 

感謝,

回答

4

您還沒有實際創建了一個名爲A.B一個導入的模塊,因爲A是不是一個包。您不能在C中創建軟件包,僅限於模塊;包是由文件系統定義的(或者由一個備用的加載器來定義,但在這裏並不重要)。