问题描述
是否可以在已经安装了OpenSSL的Linux机器上安装python的SSL模块,而无需重新编译python?我希望它就像复制几个文件并将它们包括在库路径中一样简单. Python版本是2.4.3.谢谢!
Is it possible to install the SSL module for python on a linux box that already has OpenSSL installed without recompiling python? I was hoping it would be as simple as copying over a few files and including them in the library path. Python version is 2.4.3.Thanks!
推荐答案
是的. Python的setup.py
使用以下逻辑来检测OpenSSL:
Yes. Python's setup.py
uses the following logic to detect OpenSSL:
search_for_ssl_incs_in = [
'/usr/local/ssl/include',
'/usr/contrib/ssl/include/'
]
ssl_incs = find_file('openssl/ssl.h', inc_dirs,
search_for_ssl_incs_in
ssl_libs = find_library_file(self.compiler, 'ssl',lib_dirs,
['/usr/local/ssl/lib',
'/usr/contrib/ssl/lib/'
] )
if (ssl_incs is not None and
ssl_libs is not None):
exts.append( Extension('_ssl', ['_ssl.c'],
include_dirs = ssl_incs,
library_dirs = ssl_libs,
libraries = ['ssl', 'crypto'],
depends = ['socketmodule.h']), )
关键是Python不是针对libssl
和libcrypto
的静态链接. (某些静态链接与cctyes
一起发生,但没有其他内容.)
The point is Python is not static linking against libssl
and libcrypto
. (Some static linking occurs with cctyes
, but nothing else).
现在,不好的是,该项目在本地安装的路径之前 使用了系统路径.例如,项目使用inc_dirs
(系统)之前 search_for_ssl_incs_in
(本地). (有关详情,请参见下文.)
Now, the bad thing is that the project uses system paths before your locally installed paths. For example, the project uses inc_dirs
(system) before search_for_ssl_incs_in
(local). (See more on this below).
运行configure
后,您将得到一个Modules/Setup
,其中注释了以下几行:
After you run configure
, you will have a Modules/Setup
with the following lines commented out:
# Socket module helper for SSL support; you must comment out the other
# socket line above, and possibly edit the SSL variable:
#SSL=/usr/local/ssl
#_ssl _ssl.c \
# -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
# -L$(SSL)/lib -lssl -lcrypto
同样,没有静态链接. (并且假定Python的先前版本未注释这些行).
Again, no static linking. (And this assumes the previous version of Python uncommented those lines).
因此,您应该能够构建Openem的二进制兼容版本,并使用LD_LIBRARY_PATH
或LD_PREOLAD
确保Python使用更新的OpenSSL版本.
So you should be able to build a binary compatible version of OpenSSL and use LD_LIBRARY_PATH
or LD_PREOLAD
to ensure Python uses your updated version of OpenSSL.
OpenSSL 0.9.7和0.9.8是二进制兼容的. OpenSSL 1.0.0、1.0.1和1.0.2是二进制兼容的. OpenSSL 0.9.8和1.0.0是不二进制兼容的.
OpenSSL 0.9.7 and 0.9.8 are binary compatible. OpenSSL 1.0.0, 1.0.1 and 1.0.2 are binary compatible. OpenSSL 0.9.8 and 1.0.0 are not binary compatible.
这是Python的设置放置系统包含之前本地包含的问题:
Here's the problem with Python's setup placing system includes before local includes:
export CFLAGS="-I/usr/local/ssl/darwin/include"; export LDFLAGS="-L/usr/local/ssl/darwin/lib"
<edit Setup search_for_ssl_incs_in and search_for_ssl_incs_in>
./configure
<edit Modules/Setup>
make
...
/Users/jww/Python-3.4.2/Modules/_ssl.c:390:9: warning:
'ERR_peek_last_error' is deprecated [-Wdeprecated-declarations]
e = ERR_peek_last_error();
^
/usr/include/openssl/err.h:274:15: note: 'ERR_peek_last_error' declared here
unsigned long ERR_peek_last_error(void) DEPRECATED_IN_MAC_OS_X_VERSION_1...
^
/Users/jww/Python-3.4.2/Modules/_ssl.c:393:15: warning:
'SSL_get_error' is deprecated [-Wdeprecated-declarations]
err = SSL_get_error(obj->ssl, ret);
...
Python使用了Apple提供的OpenSSL的较低版本0.9.8版本,而不是我最近的OpenSSL 1.0.1k.尽管我(1)将它们导出到CFLAGS
和LDFLAGS
中; (2)编辑Setup
;和(3)编辑Modules/Setup
.
Python used the down level version 0.9.8 version of OpenSSL provided by Apple, and not my recent OpenSSL 1.0.1k. That's despite me (1) exporting them in CFLAGS
and LDFLAGS
; (2) editing Setup
; and (3) editing Modules/Setup
.
我仍然需要解决运行时路径问题,因此我需要使用LD_PRELOAD_PATH
,DYNLIB_LIBRARY_PATH
等.
And I still have runtime path problems to contend with, so I'll need to use LD_PRELOAD_PATH
, DYNLIB_LIBRARY_PATH
, etc.
这篇关于在Linux上安装python ssl模块而无需重新编译的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!