2012-08-23 11 views
16

私はdistutilsでパッケージ化した多くのサブモジュールを持つPythonプロジェクトを持っています。私はこれらのサブモジュールのいくつかに住むためにC言語でいくつかのPython拡張をビルドしたいと思いますが、私はサブモジュールにPython拡張モジュールをインストールする方法を理解していません。以下は、私が探しているものの最も簡単な例です。Python C Extensionをビルドしてモジュールからインポートする方法

#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'])]) 

の中にインストールした後、ここで

は私のPython拡張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 

答えて

12

だけ

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

にあなたを

Extension('c_extension', ...) 

を変更しますいつものようにfoobarの各ディレクトリに__init__.py個のファイルが必要です。これらは、あなたのsetup.pyでモジュールにパッケージ化させるには、あなたのセットアップに

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

を追加する必要があります()を呼び出して、あなたのソースディレクトリにディレクトリ構造

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

が必要になります。

+0

答えに感謝しますが、それは私のためにはうまくいかなかった。私は 'foo/bar'ディレクトリに' __init __。py'をつけて、 'foo.bar.'という接頭辞をsetupコマンドに追加しましたが、これは次のように起こります: >>> import foo.bar.c_extension トレースバック(最新の呼び出しの最後): はImportErrorで ファイル「」、行1、:C_EXTENSION – Rich

+0

そして、ちょうどあなたの編集を見たという名前のモジュール、私もパッケージラインを追加しました。 – Rich

+0

あなたはどのバージョンのPythonを使用していますか?私は2.7.3でテストしています。 – nneonneo

関連する問題