编写包含多个C模块的Python包

11 投票
2 回答
2878 浏览
提问于 2025-04-15 18:47

我正在写一个Python的C扩展,使用的是pygame的C接口。目前一切都还不错。现在我想知道如何组织我的源代码,以便在这个包里有多个子模块。网上的教程大多只关注一个.c文件的扩展。我试着看了一些项目的setup.py文件,但那些复杂的内容让我感到困惑,根本看不清楚重点。

简单来说,我有一个扩展,叫做MyExt。MyExt有全局函数和三种类型。我该如何组织PyMethodDef列表呢?我需要把它们都放在一个列表里吗?另外,我注意到传给setup函数的Extension对象其实是一个模块数组,那么我该如何给这些模块命名,让它们都在一个包下,并且能够互相访问呢?

我的setup.py如下:

main_mod = Extension('modname',
                include_dirs = ['C:\Libraries\Boost\include',
                                'C:\Libraries\SDL\include',
                                'C:\Libraries\SDL_image\include'],

                libraries = ['libSDL',
                             'SDL_image'],

                library_dirs = ['C:\Libraries\SDL\lib',
                                'C:\Libraries\SDL_image\lib'],

                sources = ['main.cpp',
                           'Object1.cpp',
                           'Object2.cpp',
                           'Etcetera.cpp'])

所以当我调用:setup(name = "某个易读的名字,对吧?", ext_modules = [main_mod])时,我可以在ext_modules列表中添加其他模块,但我该把什么作为'Extension'的第一个参数呢?我需要用像'mypackage.submodule'这样的点分字符串吗?

更一般来说,我该如何组织一个有多个子模块的C扩展呢?如果有人能指给我一些易于阅读和理解的源代码,那就太好了。非常感谢!

2 个回答

1

我不太确定我是否理解你想要的。不过,Python中有一种叫做命名空间的包。你可以把模块放在不同的地方,但它们都共享同一个包名。你可以参考这个问题 如何在Python中创建命名空间包?

14

我觉得最简单的方法就是用“纯Python”来创建这个包。也就是说,先创建一个叫 mypackage/ 的文件夹,然后在里面创建一个空的 mypackage/__init__.py 文件,接着把你的扩展模块放在 mypackage/module1.somypackage/module2.so 这些地方。

如果你想在 mypackage 里放点东西,而不是让它空着,你可以在你的 __init__.py 文件里从其他扩展模块导入它们。

撰写回答