我需要在没有根访问权限的RHEL上安装几个Python模块。至少有一个模块还需要访问Python.h
。
在本例中,我发现最好的方法是在~/local
中安装python及其依赖项。它通常只起作用,但这次Python未能构建SSL模块(请参阅下面的详细信息)。这是我在做什么的痕迹。
所以我下载了Python6的源代码,然后离开:
./configure --prefix=/home/fds/rms/local
make >& make.log
对日志的检查显示尚未编译ssl模块,但未提及原因(在生成或配置中未发生其他ssl):
Failed to find the necessary bits to build these modules:
_bsddb _curses _curses_panel
_hashlib _sqlite3 _ssl <----------
所以我想,python根本找不到任何ssl库(这很奇怪,但是嘿…)。所以我下载了openssl-0.9.8r和
./config --prefix=/home/fds/rms/local shared
make
make install
现在回到Python,I./configure并再次生成。失败了,但这次不同了:
Failed to build these modules:
_hashlib _ssl
仔细查看日志文件可以发现:
gcc -pthread -shared build/temp.linux-x86_64-2.6/home/fds/rms/installers/Python-2.6.6/Modules/_ssl.o -L/home/fds/rms/local/lib -L/usr/local/lib -lssl -lcrypto -o build/lib.linux-x86_64-2.6/_ssl.so
*** WARNING: renaming "_ssl" since importing it failed: libssl.so.0.9.8: cannot open shared object file: No such file or directory
所以现在它正在收集库,但还没有完全正确(文件应该在那里):
$ find /home/fds/rms/local -iname libssl.so.0.9.8
/home/fds/rms/local/lib/libssl.so.0.9.8
接下来是跟踪make并查看它在哪里查找文件:
$ strace -f make 2>&1 | grep libssl.so.0.9.8
[pid 5584] open("/lib/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 5584] open("/usr/lib/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 5584] open("/lib64/tls/x86_64/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 5584] open("/lib64/tls/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 5584] open("/lib64/x86_64/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 5584] open("/lib64/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 5584] open("/usr/lib64/tls/x86_64/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 5584] open("/usr/lib64/tls/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 5584] open("/usr/lib64/x86_64/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 5584] open("/usr/lib64/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 5584] write(1, "*** WARNING: renaming \"_ssl\" sin"..., 131*** WARNING: renaming "_ssl" since importing it failed: libssl.so.0.9.8: cannot open shared object file: No such file or directory
[pid 5584] open("/lib/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 5584] open("/usr/lib/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 5584] open("/lib64/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 5584] open("/usr/lib64/tls/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 5584] open("/usr/lib64/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 5584] write(1, "*** WARNING: renaming \"_hashlib\""..., 135*** WARNING: renaming "_hashlib" since importing it failed: libssl.so.0.9.8: cannot open shared object file: No such file or directory
嗯,它找错地方了。我试着暗示一下:
CPPFLAGS="-I/home/fds/rms/local/include -I/home/fds/rms/local/include/openssl" LDFLAGS="-L/home/fds/rms/local/lib" ./configure --prefix=/home/fds/rms/local
但是没有什么变化,而且make
似乎根本没有尝试/home/fds/rms/local/lib
。
我已经好几年没这么做了,所以也许我忽略了一些事情。有人能帮忙解决这个问题吗?
提前谢谢。
对我来说,编辑
Modules/Setup
是不够的,因为_hashlib
模块最终仍然使用了错误的OpenSSL版本;而且LD_LIBRARY_PATH
在SLES系统上运行时没有考虑。工作原理是通过根据GitHub patch: eddy-geek/ python_custom_openssl.diff编辑
setup.py
,然后make clean && make
,静态地将本地OpenSSL链接到_ssl
和_hashlib
。有关我为什么在Coredump when compiling python with a custom openssl version处的堆栈溢出上使用静态链接的详细信息。
如果OpenSSL不在标准位置,则需要编辑
Modules/Setup.dist
以指定其位置。来自Getting SSL Support in Python 2.5.1:确保通过清理源根(例如
make distclean
)来获取对Modules/Setup.dist
的更改,并再次运行configure
和make
。在Bourne shell中(/bin/sh或/bin/bash):
在C-shell(/bin/csh或/bin/tcsh)中:
相关问题 更多 >
编程相关推荐