【问题标题】:python c api to create a python modulepython c api创建python模块
【发布时间】:2012-01-09 21:24:47
【问题描述】:

我正在用 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 的 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__'

谢谢,

【问题讨论】:

    标签: python c python-module


    【解决方案1】:

    您实际上并没有创建一个名为A.B 的可导入模块,因为A 不是一个包。您不能在 C 中创建包,只能创建模块;包由文件系统定义(或由备用加载程序,但在这里不相关)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-04
      • 2017-02-20
      • 1970-01-01
      • 1970-01-01
      • 2011-11-29
      • 2011-07-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多