我想在我没有 root (或 sudo)权限的远程(Debian squeeze)系统上安装某个(非公开的、数字的)python 模块。由于未安装 python-dev 包,我编译并本地安装了 python 2.7(使用 ./configure --prefix=$HOME/rt)。我同样使用 setup.py 的 --user 选项安装了 numpy、scipy 和 tinyarray,因为这些是必需的。后来我安装了该模块,没有出现任何问题。但是,在 python 中导入模块后,我收到以下消息:
RuntimeWarning:安装的 SciPy 不使用 UMFPACK。相反,SciPy 将使用它附带的 SuperLu 版本。在这种情况下,性能可能会非常差。
事实上,表现很差。经过进一步研究发现该模块支持使用 umfpack 和 MUMPS。两者都可以接受,但在不同的系统上,我发现 MUMPS 的性能稍好一些。我安装也没有成功。关于 umfpack,除了似乎不再存在的 scipy 的 scipack 之外,我没有找到任何有关如何安装它的信息。
所以我尝试安装 MUMPS。
从模块的安装文件:
构建配置
安装脚本必须知道如何链接 LAPACK 和 BLAS,以及可选的 MUMPS。默认情况下,它会假设 LAPACK 和 BLAS 可以在它们常用的名称下找到。默认情况下,MUMPS 不会被链接,除非在
libmumps-scotch-dev
安装软件包时在基于 Debian 的系统上。
build.conf
所有这些设置都可以通过在发行版根目录中创建/编辑文件来配置 。该配置文件由多个部分组成,每个依赖项对应一个部分,由 [dependency-name] 标头引导,后跟 name = value 条目。可能的名称是关键字参数distutils.core.Extension
(有关完整列表,请参阅从this document <http://docs.python.org/distutils/apiref.html>
_ 顶部开始的第三个表)。相应的值是以空格分隔的字符串列表。当前可能的两个部分是 [lapack] 和 [mumps]。前者配置针对 LAPACK 的链接和BLAS,后者对抗 MUMPS(没有 LAPACK 和 BLAS)。
build.conf
链接自编译 MUMPS、SCOTCH <http://www.labri.fr/perso/pelegrin/scotch/>
_ 和METIS <http://glaros.dtc.umn.edu/gkhome/metis/metis/overview>
_的示例::
[mumps]
libraries = zmumps mumps_common pord metis esmumps scotch scotcherr mpiseq
gfortran
与 Intel MKL 链接的示例
build.conf
.::
[lapack]
libraries = mkl_intel_lp64 mkl_sequential mkl_core mkl_def
library_dirs = /opt/intel/mkl/lib/intel64
extra_link_args = -Wl,-rpath=/opt/intel/mkl/lib/intel64
详细语法
build.conf
在documentation of Python's configparser module <http://docs.python.org/3/library/configparser.html#supported-ini-file-structure>
_.
我编译了 MUMPS 并重建了模块,使用如下的 build.conf:
[mumps]
libraries = zmumps mumps_common pord
library_dirs = /*path_to_mumps_compilation*/lib /*path_to_mumps_compilation*/libseq
include_dirs = /*path_to_mumps_compilation*/include
extra_link_args = -Wl,-rpath=/*path_to_mumps_compilation*/lib
重新安装模块并在 python 中导入后,出现导入错误:
/*path_to*/_mumps.so: 未定义符号: mumps_get_mapping
在检查 _mumps.so 后,似乎该符号确实未定义。这是安装过程中使用的 _mumps.so 的链接命令:
gcc -pthread -shared build/temp.linux-i686-2.7/kwant/linalg/_mumps.o -L/u/fphys/iw386/rt/lib -lmumps_common -lzmumps -lpord -lmetis -lesmumps -lscotch -lscotcherr -lmpiseq -llapack -lblas -o build/lib.linux-i686-2.7/kwant/linalg/_mumps.so -Wl,-rpath=/u/fphys/iw386/rt/lib
请注意,mumps_common 已加载,并且 mumps_get_mapping 在 libmumps_common.a 中未定义:
$ nm -g rt/lib/libmumps_common.a |grep mumps_get_mapping
00000000 T mumps_get_mapping
我不太清楚什么是“暂定符号”。这是否也意味着未定义?
然后,我还尝试通过从源代码构建 scotch 和 metis 来安装它们(如安装文件中的示例中所建议的那样)并使用此 build.conf:
[mumps]
libraries = zmumps mumps_common pord metis esmumps scotch scotcherr mpiseq gfortran
library_dirs = /u/fphys/iw386/rt/lib
include_dirs = /u/fphys/iw386/rt/include
extra_link_args = -Wl,-rpath=/u/fphys/iw386/rt/lib
其中所有库已移至 /u/fphys/iw386/rt/lib ,所有头文件已移至 /u/fphys/iw386/rt/include
导入时的错误消息现已更改为
_mumps.so:未定义符号:for_write_seq_lis
for_write_seq_lis似乎是一个与fortran相关的方法。然而,我使用的gfortran库文件是系统通过gfortran包提供的。我宁愿避免尝试从源代码构建 gfortran 和 gcc 及其依赖项。
任何帮助,将不胜感激。