擅长:python、mysql、java
<p>这里有两个问题:第一,<code>Py_InitModule</code>和朋友希望创建导入的模块<em>。提示是您传递给它的字符串不是模块的完全限定名:Python使用它已经知道的名称来确定在<code>sys.modules</code>中放置新对象的位置。但是,您可以使用<strong>完全限定的</strong>名称;其他魔法属性(如<code>__file__</code>)将具有正确的值</p>
<p>第二个问题是需要在包含模块上设置<strong>属性</strong><code>light</code>,以便<code>from</code>导入工作</p>
<p>同时,没有理由使用单独的初始化函数(解释器将永远不会调用该函数),将它们结合使用可以避免以后需要恢复指向模块的指针:</p>
<pre class="lang-c prettyprint-override"><code>static PyTypeObject FooType = { ... };
PyMODINIT_FUNC initsysipc(void) {
PyObject *module = Py_InitModule3("sysipc", ...);
...
PyObject *const sub = Py_InitModule3("company.dept.sys.sysipc.light", ...);
...
PyType_Ready(&FooType);
// PyModule_AddObject steals a reference:
Py_INCREF(FooType);
PyModule_AddObject(sub, "FooType", &FooType);
Py_INCREF(sub);
PyModule_AddObject(module, "light", sub);
}
</code></pre>
<p>也就是说,<code>sysipc</code>仍然不是一个合适的包:至少,它缺少<code>__path__</code>。如果这很重要,您可能更喜欢使用真实(如果更复杂)包体系结构的<a href="https://stackoverflow.com/a/64124420/8586227">MEE's answer</a></p>