2013-04-14 75 views
1

我正在学习/尝试在C中的Python扩展。我试图包装一个C库,以便它可以以更Pythonic的方式使用。例如:命名空间/软件包名称与Python的C扩展

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扩展程序通常如何打包/分发?

+1

你有一个有效的mylib包吗?即带\ _ \ _ init \ _ \ _。py文件的mylib目录 –

回答

0

哇,伙计。扩展可以有子模块,但你可能必须在C init()函数中定义它们;正如你所看到的,诡异的东西在这个概念上放弃了鬼魂。我会做这样的事情,而不是:

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网站包。

相关问题