我想构建包含多个扩展子包的包:
| root
| ----> a
| ----> a1
| ----> a2
| ----> b
| ----> c
正如您所看到的,其中一个子包具有它自己的子包。在setup.py文件中,我构建了这样的包:
from distutils.core import setup
from distutils.core import Extension
modules = [
Extension('root.a.a', sources=['root/a/a.c']),
Extension('root.a.a1', sources=['root/a/a1.c']),
Extension('root.a.a2', sources=['root/a/a2.c']),
Extension('root.b', sources=['root/b/b.c']),
Extension('root.c', sources=['root/c/c.c']),
]
setup(
....
packages=['root', 'root.a'],
....
ext_modules=modules,
)
包构建成功。我可以运行python解释器并导入它,但是当尝试执行某些方法时会出现错误:
>>> from root import b
>>> b.foo()
>>> AttributeError: 'module' object has no attribute 'foo'
dir()也没有显示任何内容。我知道哪里错了?
b.c的来源是:
PyMethodDef module_methods[] = {
{ "foo", (PyCFunction)py_foo, METH_VARARGS | METH_KEYWORDS, "Foobar" },
{ NULL, NULL, 0, NULL }
};
#if PY_MAJOR_VERSION >= 3
static struct PyModuleDef module_def = {
PyModuleDef_HEAD_INIT,
"b",
NULL,
-1,
module_methods
};
#endif
PyMODINIT_FUNC
#if PY_MAJOR_VERSION >= 3
PyInit_b(void)
{
#else
initb(void) {
#endif
#pragma GCC diagnostic ignored "-Wunused-but-set-variable"
PyObject *module = NULL;
#if PY_MAJOR_VERSION >= 3
module = PyModule_Create(&module_def);
#else
module = Py_InitModule("b", module_methods);
#endif
#if PY_MAJOR_VERSION >= 3
return module;
#else
return;
#endif