簡體   English   中英

具有Python C擴展名的命名空間/程序包名稱

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM