从Djang导入.so文件

2024-03-28 21:03:33 发布

您现在位置:Python中文网/ 问答频道 /正文

<>我有一个C++代码< /p>
#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应用程序中使用这个库,但是我不知道该把这个库保存在我的目录中的什么地方。显然,我试着把它和代码放在一起,但它似乎找不到它。我发现了与我的情况类似的{a1}教程,但是其中的C++代码中没有包含python。h。请帮忙。在


Tags: to代码pyselfincludeargsourstatic
2条回答

我认为你应该创造一个设置.py文件,这样就可以编译库并将其放在某个地方。在

例如,这里有一个设置.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/”文件夹,但您当然可以在the official documentation page上找到有关setuptools的更多信息。在

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

好吧,既然您已经通过将.so文件放在views.py文件旁边的app文件夹中解决了您的问题,下面就为您提供一些小技巧。在

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

相关问题 更多 >