从Django导入.so文件

Import a .so file from Django

本文关键字:文件 so 导入 Django      更新时间:2023-10-16

我有一个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应用程序中使用这个库,但我不知道该把这个库放在我的目录中。很明显,我试着把它和代码放在一起,但它似乎找不到它。我发现这个教程和我的例子类似,但那里的C++代码中没有Python.h。请帮忙。

我认为您应该创建一个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"])]
)

这将生成一个"build/"文件夹,但您当然可以在官方文档页面上找到更多关于setuptools的信息。

由于我们看不到库的目录结构,您的模块中似乎缺少import条件,例如将__init__.py放在适当的位置或为输出模块编写正确的扩展名。

好吧,由于您已经通过views.py文件旁边的应用程序文件夹中放置.so文件来解决您的问题,下面还有一些提示。

如果由于任何原因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。