嵌套的Python C扩展/模块?
我想知道怎么编译一个C-Python模块,让它能在另一个模块里使用。比如说,我有一个叫“bar”的模块,还有一个叫“mymodule”的模块,我该怎么编译“bar”,让它可以通过“import mymodule.bar”来导入呢?
(抱歉,如果我表达得不太清楚,我不太确定该用什么专业术语。)
我在setup.py里试过以下方法,但似乎不太奏效:
from distutils.core import setup, Extension
setup(name='mymodule',
version='1.0',
author='Me',
ext_modules=[Extension('mymodule', ['mymodule-module.c']),
Extension('bar', ['bar-module.c'])])
编辑
谢谢你,Alex。最后我用的是这个:
from distutils.core import setup, Extension
PACKAGE_NAME = 'mymodule'
setup(name=PACKAGE_NAME,
version='1.0',
author='Me',
packages=[PACKAGE_NAME],
ext_package=PACKAGE_NAME
ext_modules=[Extension('foo', ['mymodule-foo-module.c']),
Extension('bar', ['mymodule-bar-module.c'])])
当然还需要一个名为“mymodule”的文件夹,里面有一个__init__.py
文件。
1 个回答
5
说明在这里:
Extension('foo', ['src/foo1.c', 'src/foo2.c'])
这个代码表示一个扩展,它位于根包中,而
Extension('pkg.foo', ['src/foo1.c', 'src/foo2.c'])
则表示同样的扩展,但它在pkg包里。两个情况下的源文件和生成的目标代码是一样的;唯一的区别是它们在文件系统中的位置(也就是在Python的命名空间层级中的位置)。
记住,一个包总是一个包含模块__init__
的目录(或压缩文件)。要创建一个作为包主体的模块,这个模块会叫做__init__
,并放在包的目录(或压缩文件)下。我在C语言中从来没有这样做过;如果直接这样做不行,可以把模块命名为比如_init
,然后在__init__.py
中写from _init import *
(这是from ... import *
为数不多的合法用法之一;-)。