从Django导入.so文件

时间:2015-07-03 06:30:24

标签: python c++ django

我有一个C ++代码

#include <Python.h>

static PyObject* py_veripy(PyObject* self, PyObject* args){

    /* BODY */
    return Py_BuildValue("i", 1);

}

// Bind Python function names to our C functions
static PyMethodDef veripy_methods[] = {
    {"veripy", py_veripy, METH_VARARGS},
    {NULL, NULL}
};

// Python calls this to let us initialize our module
extern "C" void initveripy(){
    (void) Py_InitModule("veripy", veripy_methods);
}

我编译了它并创建了一个.so文件。我想在我的一个Django应用程序中使用这个库,但我很困惑在哪里将这个库保存在我的目录中。显然,我已经尝试将其与代码保持一致,但它似乎没有找到它。我发现this教程与我的情况类似,但其中的C ++代码中没有包含Python.h。请帮忙。

2 个答案:

答案 0 :(得分:2)

我认为您应该创建一个setup.py文件,以便编译您的库并将其放在某处。

例如,这里是我用于个人项目的setup.py文件的示例:

from setuptools import setup, Extension

setup(
      name="modulename", 
      version="0.1",
      test_suite = "nose.collector",
      author='<author name>',
      setup_requires=['nose>=0.11'],
      description="My super module implementation",
      ext_modules=[Extension("modulename", ["src/mysupermodule.c"])]
)

这将生成一个&#39; build /&#39;文件夹,但您当然可以在the official documentation page上找到有关setuptools的更多信息。

答案 1 :(得分:1)

由于我们无法查看您图书馆的目录结构,因此您似乎必须错过模块中的import条件,例如将__init__.py放在位置或为输出模块编写正确的扩展名。

好吧,因为您已经通过将.so文件放在views.py文件旁边的应用程序文件夹中解决了问题,所以这里有更多的提示。

如果由于任何原因,Python解释器无法识别.so模块,例如filename.so,则需要在其旁边放置一个filename.py文件,其中包含以下内容

def __bootstrap__():
   global __bootstrap__, __loader__, __file__
   import sys, pkg_resources, imp
   __file__ = pkg_resources.resource_filename(__name__,'filename.so')
   __loader__ = None; del __bootstrap__, __loader__
   imp.load_dynamic(__name__,__file__)
__bootstrap__()

这可确保正确导入filename.so

首选使用Cython与C / C ++或FORTRAN进行交互。它是跨平台的。正如您所知,.so文件仅适用于linux / mac。