我有一个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。请帮忙。
答案 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。