编写具有多个C模块的Python包

时间:2010-02-02 15:29:58

标签: python module organization

我正在编写一个使用pygame C API的Python C扩展。到现在为止还挺好。现在我想知道如何组织我的源代码,以便我可以在包中有多个子模块。所有教程都集中在一个.c文件扩展名上。我试着查看一些项目的setup.py文件,但是它们让我的思绪变得复杂,我无法看到森林中的树木。

基本上,我有一个扩展,比如MyExt。 MyExt具有全局功能,有3种类型。我如何组织PyMethodDef列表?我是否必须将所有这些都放在一个列表中?或者,我注意到你传递给setup函数的Extension对象实际上是一个模块数组,所以我如何命名这些模块,以便它们都在一个包下并可以看到对方? / p>

我的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 =“Some Human Readable Name,Right?”,ext_modules = [main_mod]) 我可以将其他模块添加到ext_modules列表中,但作为第一个参数传递给'Extension'的是什么?我是否使用像'mypackage.submodule'这样的点分隔字符串?

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

2 个答案:

答案 0 :(得分:14)

我认为最简单的方法是在“纯python”中创建包;换句话说,创建mypackage/,创建一个空的mypackage/__init__.py,然后将您的扩展模块放在mypackage/module1.somypackage/module2.so,依此类推。

如果您想要mypackage中的内容而非空白内容,则可以从__init__.py中的其他扩展程序模块导入它们。

答案 1 :(得分:1)

我不确定我是否理解你想要的东西。但是有一种名称空间的Python包。您可以将模块放在不同的位置,但它们都共享相同的包名称。在这里,您可以参考这个问题How do I create a namespace package in Python?