如何在不使用 ctype Linux 的情况下将 so 文件作为模块导入?
How can I import so file as a module without using ctype Linux?
文件夹/home/cyan/TEMP
下的文件结构
test.py
lib
|--libc_test_module.so
c_test_module.cc
CMakeLists.txt
test.py
import sys
sys.path.append("/home/cyan/TEMP/lib")
import c_test_module
c_test_module.cc
#include <Python.h>
int c_test_function(int a) {
return a + 1;
}
static PyObject * _c_test_function(PyObject *self, PyObject *args)
{
int _a;
int res;
if (!PyArg_ParseTuple(args, "i", &_a))
return NULL;
res = c_test_function(_a);
return PyLong_FromLong(res);
}
/* define functions in module */
static PyMethodDef TestMethods[] =
{
{"c_test_function", _c_test_function, METH_VARARGS,
"this is a c_test_function"},
{NULL, NULL, 0, NULL}
};
static struct PyModuleDef c_test_module = {
PyModuleDef_HEAD_INIT,
"c_test_module", "Some documentation",
-1,
TestMethods
};
PyMODINIT_FUNC PyInit_c_test_module(void) {
PyObject *module;
module = PyModule_Create(&c_test_module);
if(module==NULL) return NULL;
/* IMPORTANT: this must be called */
import_array();
if (PyErr_Occurred()) return NULL;
return module;
}
错误
ModuleNotFoundError: No module named 'c_test_module'
问题
我不想使用 ctype
模块导入 .so
文件。相反,我想知道是否有办法直接将此文件作为模块导入。
我创建了一个 setup.py
文件:
from distutils.core import setup, Extension
import numpy
def main():
setup(name="c_test_module",
version="1.0.0",
description="Python interface for the c_test_module C library function",
author="cyan",
author_email="xxx@gmail.com",
ext_modules=[Extension("c_test_module", ["c_test_module.cc"],
include_dirs=[numpy.get_include()])],
)
if __name__ == "__main__":
main()
现在可以导入 c_test_module
并调用函数了。
文件夹/home/cyan/TEMP
test.py
lib
|--libc_test_module.so
c_test_module.cc
CMakeLists.txt
test.py
import sys
sys.path.append("/home/cyan/TEMP/lib")
import c_test_module
c_test_module.cc
#include <Python.h>
int c_test_function(int a) {
return a + 1;
}
static PyObject * _c_test_function(PyObject *self, PyObject *args)
{
int _a;
int res;
if (!PyArg_ParseTuple(args, "i", &_a))
return NULL;
res = c_test_function(_a);
return PyLong_FromLong(res);
}
/* define functions in module */
static PyMethodDef TestMethods[] =
{
{"c_test_function", _c_test_function, METH_VARARGS,
"this is a c_test_function"},
{NULL, NULL, 0, NULL}
};
static struct PyModuleDef c_test_module = {
PyModuleDef_HEAD_INIT,
"c_test_module", "Some documentation",
-1,
TestMethods
};
PyMODINIT_FUNC PyInit_c_test_module(void) {
PyObject *module;
module = PyModule_Create(&c_test_module);
if(module==NULL) return NULL;
/* IMPORTANT: this must be called */
import_array();
if (PyErr_Occurred()) return NULL;
return module;
}
错误
ModuleNotFoundError: No module named 'c_test_module'
问题
我不想使用 ctype
模块导入 .so
文件。相反,我想知道是否有办法直接将此文件作为模块导入。
我创建了一个 setup.py
文件:
from distutils.core import setup, Extension
import numpy
def main():
setup(name="c_test_module",
version="1.0.0",
description="Python interface for the c_test_module C library function",
author="cyan",
author_email="xxx@gmail.com",
ext_modules=[Extension("c_test_module", ["c_test_module.cc"],
include_dirs=[numpy.get_include()])],
)
if __name__ == "__main__":
main()
现在可以导入 c_test_module
并调用函数了。