簡體   English   中英

如何構建Python C擴展,以便我可以從模塊中導入它

[英]How to build a Python C Extension so I can import it from a module

我有一個包含許多子模塊的Python項目,我用distutils打包。 我想在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 shell中的行為如下所示:

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

只是改變

Extension('c_extension', ...)

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

像往常一樣,每個foobar目錄中都需要__init__.py文件。 要將這些包裝在setup.py中的模塊中,您需要添加

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

到你的setup()調用,你將需要目錄結構

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

在您的源目錄中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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