1

C で Python 拡張機能を学習/実験しています。より Pythonic な方法で使用できるように 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 拡張機能は一般的にどのようにパッケージ化/配布されますか?

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ファイル (または*.pydWindows) はpackage_name/、python サイト パッケージのディレクトリ内に配置されます。

于 2013-09-18T04:13:03.673 に答える