Python扩展模块

时间:2017-12-06 14:40:16

标签: python python-3.x distutils

我想构建包含多个扩展子包的包:

| 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   

0 个答案:

没有答案