嵌套的Python C扩展/模块?

7 投票
1 回答
1632 浏览
提问于 2025-04-15 15:42

我想知道怎么编译一个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 *为数不多的合法用法之一;-)。

撰写回答