我正在尝试为 C Cholmod库创建一个 Python 接口,它是SuiteSparse库 ( SuiteSparse ) 的一部分。
由于我是 Swig 的新手,我不知道这是否是一项艰巨的任务。我没有在 Swig 中找到对这个接口的任何引用。
编译没有问题。
这是我尝试导入 swig 生成的“_cholmod.py”文件时遇到的错误:
Python 2.7.5+ (default, Feb 27 2014, 19:37:08)
[GCC 4.8.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import _cholmod
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "_cholmod.py", line 99, in <module>
class SuiteSparse_config_struct(_object):
File "_cholmod.py", line 106, in SuiteSparse_config_struct
__swig_setmethods__["malloc_func"] =
__cholmod.SuiteSparse_config_struct_malloc_func_set
NameError: name '_SuiteSparse_config_struct__cholmod' is not defined
这个名字是在哪里定义的? 在我尝试导入扩展之前,快速 grep 不会返回任何内容 ,但是在我尝试导入它之后:
grep -R -n _SuiteSparse_config_struct__cholmod *
Binary file _cholmod.pyc matches
我在用着:
- SWIG 版本 3.0.5 使用 g++ [x86_64-unknown-linux-gnu] 编译配置选项:+pcre
- SuiteSparse 4.4.3 中的 cholmod 库
这是一个最小的例子:
文件 setup.py:
from distutils.core import setup, Extension
module1 = Extension('__cholmod',
sources=['cholmod.i'],
libraries=['cholmod', 'suitesparseconfig', 'blas', 'amd'],
library_dirs=['/home/nikolaj/Documents/WORK/Dominique/suitesparse
4.4.1-1_ArchLinux/suitesparse-4.4.1-1-x86_64.pkg/usr/lib/'],
include_dirs=['/home/nikolaj/Documents/WORK/Dominique/suitesparse
4.4.1-1_ArchLinux/suitesparse-4.4.1-1-x86_64.pkg/usr/include/'],
swig_opts=['-I/home/nikolaj/Documents/WORK/Dominique/suitesparse
4.4.1-1_ArchLinux/suitesparse-4.4.1-1-x86_64.pkg/usr/include/'])
setup(name='_cholmod', version='0.1', ext_modules=[module1])
我这样调用它:
python setup.py build_ext --inplace
文件 cholmod.i:
/* -*- C -*- */
#ifdef SWIGPYTHON
%module _cholmod
%{
#define SWIG_FILE_WITH_INIT
#include "SuiteSparse_config.h"
#include "cholmod_config.h"
#include "cholmod_core.h"
#include "numpy/arrayobject.h"
%}
%feature("autodoc", "1");
%init %{
import_array();
%}
%include "SuiteSparse_config.h
%include "cholmod_config.h"
%include "cholmod_core.h"
#endif
我怀疑 typedef 和 C 结构存在问题,但在阅读了一遍又一遍教程、官方文档、演示文稿之后,我真的不知道我错过了什么。
有人可以在这里帮助我吗?非常感谢!