在非标准位置构build支持SSL的Python

我需要在一个RHEL上安装几个Python模块,我没有root权限。 至less有一个模块也需要访问Python.h

在这种情况下,我发现最好的办法是在~/local安装python及其依赖项。 它通常只是工作,但是这一次Python无法构buildSSL模块(请参阅下面的详细信息)。 这是我正在做的事情的痕迹。

于是我下载了python 6源码,关掉了我:

 ./configure --prefix=/home/fds/rms/local make >& make.log 

对日志的检查显示ssl模块没有被编译,但没有提到原因(在make或configure中没有其他的ssl发生):

 Failed to find the necessary bits to build these modules: _bsddb _curses _curses_panel _hashlib _sqlite3 _ssl <---------- 

所以我认为,python根本没有find任何ssl库(这是奇怪的,但嘿…)。 所以我下载openssl-0.9.8r和

 ./config --prefix=/home/fds/rms/local shared make make install 

现在回到Python,我./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 

Mhhh,它正在寻找所有错误的地方。 我试图给出一个提示:

 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 

但没有任何变化,并且似乎根本不会尝试/home/fds/rms/local/lib

我好几年没有这样做过,所以也许我可以忽略一些东西。 任何人都可以帮助解决问题吗?

提前致谢。

如果OpenSSL不在标准位置,您需要编辑Modules/Setup.dist来指定它的位置。 从Python 2.5.1获得SSL支持 :

如果你发现自己在Python中需要ssl支持(在httplib.HTTPSConnection或imaplib.IMAP4_SSL中使用客户端),那么让我为你节省几个小时的networking狩猎(当然,如果你有发现这个,那意味着你已经做了一些关卡了!)。

你会知道如果你需要ssl支持编译到你的python安装,如果你得到以下exception消息:AttributeError:'模块'对象没有属性'ssl'

为了使这个消失,所以你可以继续愉快地抛出python代码,你需要首先确保你已经安装了OpenSSL。 默认情况下,它是从源代码安装的:/ usr / local / ssl

如果该目录不存在,那么抓住源包。

做标准:

 tar zxf openssl-0.9.8g.tar.gz cd openssl-0.9.8g ./config make make install 

然后抓住2.5.1的Python源代码:tar zxf Python-2.5.1.tgz && cd Python-2.5.1

那么你需要编辑Modules / Setup.dist:

 204:# Socket module helper for SSL support; you must comment out the other 205:# socket line above, and possibly edit the SSL variable: 206:SSL=/usr/local/ssl 207:_ssl _ssl.c \ 208: -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \ 209: -L$(SSL)/lib -lssl -lcrypto 

如果你在默认位置安装了OpenSSL,你可以取消注释206-209行,那么:

 ./configure make make install 

然后用以下方法validation您的安

 python /usr/local/lib/python2.5/test/test_socket_ssl.py test_rude_shutdown ... test_basic ... test_timeout ... 

在Bourne shell(/ bin / sh或/ bin / bash)中:

 $ LD_LIBRARY_PATH=/usr/local/lib $ export LD_LIBRARY_PATH $ make 

在C shell(/ bin / csh或/ bin / tcsh)中:

 % setenv LD_LIBRARY_PATH /usr/local/lib % make 

对我来说,编辑Modules/Setup还不够,因为_hashlib模块仍然使用错误的OpenSSL版本; 而在我的SLES系统的运行时不考虑LD_LIBRARY_PATH

什么工作是通过编辑setup.py按照GitHub补丁:eddy-geek / python_custom_openssl.diff静态链接本地OpenSSL到_ssl和_hashlib ,然后make clean && make

更多关于为什么我在使用自定义openssl版本编译python时在Coredump上使用Stack Overflow的静态链接的更多细节。

这里是我用Python 2.7.11完成的一个过程。


在顶级Python2.7.11源代码目录中:

  1. 更改Modules/Setup.distModules/Setup :取消注释_ssl部分,注释掉_socket (如果它已经被注释掉,则为空操作),取消注释并适当地设置SSL(新的ssl lib/includespath等)

    注意:Modules / Setup文件最初不存在,但在第一次运行后,我相信从Modules / Setup.dist得到的内容。 确保在每次运行之前在这里反映更改。

  2. 应用补丁: http : //gist.github.com/eddy-geek/9604982 (如果以前跑make make distclean)

     ./configure --prefix=/root/.local/aks/py-ssl/python2.7 --enable-shared # modify: Makefile -> set svnversion to "" make make altinstall 

我得到相同的结果,直到我回到openssl的日志。 在那里,我看到在构buildopenssl:building'_ssl'扩展时需要使用-fPIC:

 gcc -pthread -fPIC -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I/usr/local/ssl/include -I. -IInclude -I./Include -I/usr/local/include -I/home/feramos/Python-2.7.3/Include -I/home/feramos/Python-2.7.3 -c /home/feramos/Python-2.7.3/Modules/_ssl.c -o build/temp.linux-x86_64-2.7/home/feramos/Python-2.7.3/Modules/_ssl.o gcc -pthread -shared build/temp.linux-x86_64-2.7/home/feramos/Python-2.7.3/Modules/_ssl.o -L/usr/local/ssl/lib -L/usr/local/lib -lssl -lcrypto -o build/lib.linux-x86_64-2.7/_ssl.so /usr/bin/ld: /usr/local/ssl/lib/libcrypto.a(x86_64cpuid.o): relocation R_X86_64_PC32 against `OPENSSL_cpuid_setup' can not be used when making a shared object; recompile with -fPIC openssl-0.9.8g]# .config -fPIC 

然后,make,安装openssl,然后重新构buildPython。

尝试向LDPATHLDPATH -Wl,-rpath,/home/fds/rms/local/lib

我正在构buildPython2.7.13,我看到了同样的问题。 对于2.7.13,您必须使用“openssl1.0.0e”或更高版本才能使其工作。 我试过openssl-0.9.8g,它不起作用。 不知何故,我不能让它只是修改Modules / Setup.dist,所以我不得不手动编译_ssl.o。 我想这是因为我提供的openssl-0.9.8g不工作,它search系统默认的libssl.so.10哪个不起作用。