2013-04-14 74 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網站包。

相關問題