1

我正在学习/实验 C 中的 Python 扩展。我正在尝试包装一个 C 库,以便可以以更 Pythonic 的方式使用它。例如:

import mylib

widget = mylib.widget.Widget(name="Hello!")
widget.show()

mylib.utils.say_hello()

在 C 代码中,传递给的模块名称分别PyModule_Create为“mylib”、“mylib.widget”和“mylib.utils”。该mylib.widget模块还包括一个新Widget类型。

但是,我似乎无法弄清楚如何使用这种包/命名空间样式来安装这些扩展。我试过了:

from distutils.core import setup, Extension

setup(
    ...
    ext_modules = [Extension('mylib', sources=['src/mylib.c'], ...), 
                   Extension('mylib.widget', sources=['src/widget.c'], ...),
                   Extension('mylib.utils', sources=['src/utils.c'], ...)]
)

但这不起作用。“mylib 没有名为 widget 的模块”。

C 扩展通常是如何打包/分发的?

4

1 回答 1

0

扩展可以有子模块,但您可能必须在 C 的 init() 函数中定义它们;如您所见, distutils 在这个概念上就放弃了幽灵。我会做这样的事情:

from distutils.core import setup,Extension

setup(
  packages = ['package_name'],
  ext_modules = [
    Extension('package_name.widget',sources=['src/widget.c']),
    Extension('package_name.utils',sources=['src/utils.c'])
  ]
)

然后让您的文件布局为:

ROOT/
 | -- setup.py
 | -- src/
 |     | -- widget.c
 |     | -- utils.c
 | -- package_name/
 |     | -- __init__.py
 |     | -- (other python files)

这样,您的*.so文件(或*.pyd在 Windows 上)最终将package_name/位于您的 python 站点包的目录中。

于 2013-09-18T04:13:03.673 回答