我正在编写一个使用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 来阅读和理解的源代码,那就太好了。非常感谢!
答案 0 :(得分:14)
我认为最简单的方法是在“纯python”中创建包;换句话说,创建mypackage/
,创建一个空的mypackage/__init__.py
,然后将您的扩展模块放在mypackage/module1.so
,mypackage/module2.so
,依此类推。
如果您想要mypackage
中的内容而非空白内容,则可以从__init__.py
中的其他扩展程序模块导入它们。
答案 1 :(得分:1)
我不确定我是否理解你想要的东西。但是有一种名称空间的Python包。您可以将模块放在不同的位置,但它们都共享相同的包名称。在这里,您可以参考这个问题How do I create a namespace package in Python?