11

我正在编写一个使用 pygame C API 的 Python C 扩展。到目前为止,一切都很好。现在我想知道如何组织我的源代码,以便我可以在包中包含多个子模块。那里的所有教程都集中在一个 .c 文件扩展名上。我尝试查看一些项目 setup.py 文件,但它们的复杂性让我大吃一惊,而且我看不到树木的森林。

基本上,我有一个扩展名,比如 MyExt。MyExt 有全局函数,3 种类型。如何组织 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 = "Some Human Readable Name, Right?", ext_modules = [main_mod]) 我可以将其他模块添加到 ext_modules 列表中,但是我应该将什么作为第一个参数传递给“扩展”?我是否使用像“mypackage.submodule”这样的点分隔字符串?

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

4

2 回答 2

14

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

如果你想要东西mypackage而不是空的,你可以从你的__init__.py.

于 2010-02-02T16:15:28.940 回答
1

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

于 2011-02-27T05:43:58.257 回答