使用Python C API创建Python模块
我正在用C语言写一个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语言的初始化函数里写这样的代码。
为了参考,我附上了两个模块的__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__'
谢谢,
1 个回答
4
你实际上并没有创建一个可以被导入的模块叫做 A.B
,因为 A
不是一个包。在C语言中,你不能创建包,只能创建模块;包是由文件系统定义的(或者通过其他加载器定义,但在这里不太相关)。