嵌套的Python C扩展/模块?

Mic*_*ael 6 python distutils python-c-api

如何编译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'])])
Run Code Online (Sandbox Code Playgroud)

编辑

谢谢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'])])
Run Code Online (Sandbox Code Playgroud)

当然还有一个名为"mymodule"的文件夹__init__.py.

Ale*_*lli 5

说明在这里

扩展名('foo', ['src/foo1.c', 'src/foo2.c'])

描述位于根包中的扩展,而

扩展名('pkg.foo', ['src/foo1.c', 'src/foo2.c'])

在 pkg 包中描述了相同的扩展。在这两种情况下,源文件和生成的目标代码是相同的;唯一的区别是生成的扩展在文件系统中的哪个位置(因此在 Python 的命名空间层次结构中的哪个位置)。

请记住,包始终是一个包含模块的目录(或 zipfile)__init__。要创建一个作为包主体的模块,该模块将被调用__init__并位于包的目录(或 zipfile)下。我从来没有在 C 中这样做过;如果直接执行它不起作用,则将模块命名为例如_init,然后__init__.py执行from _init import *(极少数合法用途之一from ... import *;-)。