2012-08-23 82 views
16

我有一個Python項目,其中包含許多子模塊,我使用distutils進行了打包。我想在C中構建一些Python擴展以生活在其中一些子模塊中,但我不明白如何讓Python擴展生活在子模塊中。下面是什麼我正在尋找最簡單的例子:如何構建一個Python C擴展,以便從模塊中導入它

這裏是我的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 

回答

12

只要改變

Extension('c_extension', ...) 

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

你照常需要foobar目錄中的每個目錄中需要__init__.py文件。有這些包裝在你的setup.py模塊,你需要

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

添加到您的設置()調用,您將需要在源目錄的目錄結構

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

+0

感謝您的答案,但這並不適合我。我用'__init __。py'在'foo/bar'目錄中加入了'foo.bar.'前綴,但是在python shell中發生了這種情況: >>> import foo.bar.c_extension 回溯(最近呼叫最後): 文件「」,第1行,在 ImportError:沒有名爲c_extension的模塊 – Rich

+0

剛剛看到您的編輯,我也添加了包行。 – Rich

+0

你使用的是什麼版本的Python?我正在測試2.7.3。 – nneonneo

相關問題