22

distutilsでパッケージ化した多くのサブモジュールを含むPythonプロジェクトがあります。これらのサブモジュールのいくつかに存在するようにCでいくつかのPython拡張機能を構築したいのですが、Python拡張機能をサブモジュールに存在させる方法がわかりません。以下は、私が探しているものの最も簡単な例です。

これが私のPython拡張機能c_extension.cです:

#include <Python.h>

static PyObject *
get_answer(PyObject *self, PyObject *args)
{
    return Py_BuildValue("i", 42);
}

static PyMethodDef Methods[] = {
    {"get_answer",  get_answer, METH_VARARGS, "The meaning of life."},
    {NULL, NULL, 0, NULL}
};

PyMODINIT_FUNC
initc_extension(void) {
  (void) Py_InitModule("c_extension", Methods);
}

そして、setup.pyこれが機能します:

from distutils.core import setup
from distutils.extension import Extension

setup(name='c_extension_demo',
      ext_modules = [Extension('c_extension', sources = ['c_extension.c'])])

virtualenvにインストールした後、これを行うことができます。

>>> import c_extension
>>> c_extension.get_answer()
42

c_extensionしかし、私はサブモジュールに住みたいと思いますfoo.bar。Pythonシェルの動作を次のようにするには、このパイプラインで何を変更する必要がありますか。

>>> import foo.bar.c_extension
>>> foo.bar.c_extension.get_answer()
42
4

1 に答える 1

16

変更するだけ

Extension('c_extension', ...)

Extension('foo.bar.c_extension', ...)

通常どおり、およびディレクトリ__init__.pyのそれぞれにファイルが必要になります。これらをsetup.pyのモジュールと一緒にパッケージ化するには、追加する必要がありますfoobar

packages = ['foo', 'foo.bar'],

setup()呼び出しに、ディレクトリ構造が必要になります

setup.py
foo/
    __init__.py
    bar/
        __init__.py

ソースディレクトリにあります。

于 2012-08-23T18:29:33.533 に答える