[英]Namespaces/packages names with Python's C extensions
我正在學習/體驗C語言中的Python擴展。我正在嘗試包裝C庫,以便可以更Python化的方式使用它。 例如:
import mylib
widget = mylib.widget.Widget(name="Hello!")
widget.show()
mylib.utils.say_hello()
在C代碼中,傳遞給PyModule_Create
的模塊的名稱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沒有名為小部件的模塊”。
一般如何打包/分發C擴展?
哇,伙計。 擴展可以具有子模塊,但是您可能必須在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
上的*.pyd
)將最終位於python網站包中的package_name/
目錄中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.