我在一个我没有权利的群集上,我正在尝试pip install mpi4py
。由于我无法安装python3-devel
软件包,因此我将其下载并放入~/.local/
。无论这是否有成功的机会,以下都让我感到困惑。
如果我只是运行pip3.4 install --user mpi4py
,我会遇到此错误:
/opt/sgi/mpt/mpt-2.14/bin/mpicc -pthread -Wno-unused-result -Werror=declaration-after-statement -DNDEBUG -fmessage-length=0 -grecord-gcc-switches -fstack-protector -O2 -Wall -D_FORTIFY_SOURCE=2 -funwind-tables -fasynchronous-unwind-tables -g -DOPENSSL_LOAD_CONF -fPIC -DHAVE_CONFIG_H=1 -DHAVE_DLFCN_H=1 -DHAVE_DLOPEN=1 -I~/.local/include/python3.4m/ -I/usr/include/python3.4m -c src/MPI.c -o build/temp.linux-x86_64-3.4/src/MPI.o
In file included from src/MPI.c:4:0:
src/mpi4py.MPI.c:4:20: fatal error: Python.h: No such file or directory
#include "Python.h"
所以我想我需要告知pip
这个标题的位置。我试着用
pip3.4 install --user --global-option=build_ext --global-option="-I~/.local/include/python3.4m/" mpi4py
但我仍然收到同样的错误(??)。我也尝试在没有全局选项的情况下为CPATH=$CPATH:~/.local/include/python3.4m
添加前缀,但无济于事。
为什么pip
会忽略包含路径?
服务器是某种Suse Linux Enterprise。
更新:我发现路径必须是绝对路径,但在链接阶段会出现同样的问题:
ls ~/.local/lib64/
libpython3.4m.so libpython3.so pkgconfig
所以我将--global-option="-L$HOME/.local/lib64/"
添加到pip
命令,然后是:
/opt/sgi/mpt/mpt-2.14/bin/mpicc -pthread _configtest.o -L/home/student/n/name/.local/lib64/ -Lbuild/temp.linux-x86_64-3.4 -lpython3.4m -o _configtest
/usr/lib64/gcc/x86_64-suse-linux/4.8/../../../../x86_64-suse-linux/bin/ld: cannot find -lpython3.4m
collect2: error: ld returned 1 exit status
failure.
removing: _configtest.c _configtest.o
error: Cannot link MPI programs. Check your configuration!!!
----------------------------------------
因此添加了库路径,-l<libname>
匹配,但它没有链接。看来,libpython3.4m.so
实际上是libpython3.4m.so.1.0
的符号链接,我找不到。也许这就是问题,因为我手动安装python3-devel
并没有安装一些依赖项。
答案 0 :(得分:0)
事实证明,作为全局选项传递的路径必须是绝对的,因此必须用主目录的完整路径替换~
。
但是,第二个问题出现了,因为libpython3.4m.so
实际上是一个符号链接,原始版本不包含在我手动安装的rpm包python3-devel
中。因此,有必要获得libpython3.4m.so.1.0
形式,例如https://rpmfind.net/linux/rpm2html/search.php?query=libpython3.4m.so.1.0()(64bit)并将其放在与链接相同的目录中。