编译安装完Python3之后,使用pip来安装python库,发现了如下报错:
$ pip install numpypip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.Collecting numpy Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by "SSLError("Can"t connect to HTTPS URL because the SSL module is not available.",)": /simple/numpy/ Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by "SSLError("Can"t connect to HTTPS URL because the SSL module is not available.",)": /simple/numpy/ Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by "SSLError("Can"t connect to HTTPS URL because the SSL module is not available.",)": /simple/numpy/ Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by "SSLError("Can"t connect to HTTPS URL because the SSL module is not available.",)": /simple/numpy/ Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by "SSLError("Can"t connect to HTTPS URL because the SSL module is not available.",)": /simple/numpy/ Could not fetch URL /simple/numpy/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host="", port=443): Max retries exceeded with url: /simple/numpy/ (Caused by SSLError("Can"t connect to HTTPS URL because the SSL module is not available.",)) - skipping Could not find a version that satisfies the requirement numpy (from versions: )No matching distribution found for numpy
网上说了一种解决方案,是在./configure 的时候,加上--with-ssl选项,然后重新编译安装,尝试了下:
$ ./configure --with-ssl... ...configure: WARNING: unrecognized options: --with-ssl... ...
出了个警告:不可识别的--with-ssl选项。
./configure --help看了下确实也没发现这个选项,估计是版本不一致,不大想折腾这个版本问题了,决定换个思路。
尝试安装openssl:
$ sudo yum install openssl
安装成功之后,重新编译安装,依旧报这个错,但是在make的时候有了一些发现:
$ make... ...Python build finished successfully!The necessary bits to build these optional modules were not found:_bz2 _curses _curses_panel _dbm _gdbm _lzma _sqlite3 _ssl _tkinter readline To find the necessary bits, look in setup.py in detect_modules() for the module"s name.
可以看到,这里虽然make成功了,但是报了很多模块缺失,查看下编译安装目录下的setup.py,搜索_ssl,可以定位到如下代码:
843 # Detect SSL support for the socket module (via _ssl) 844 search_for_ssl_incs_in = [ 845 "/usr/local/ssl/include", 846 "/usr/contrib/ssl/include/" 847 ] 848 ssl_incs = find_file("openssl/ssl.h", inc_dirs, 849 search_for_ssl_incs_in 850 ) 851 if ssl_incs is not None: 852 krb5_h = find_file("krb5.h", inc_dirs, 853 ["/usr/kerberos/include"]) 854 if krb5_h: 855 ssl_incs += krb5_h 856 ssl_libs = find_library_file(piler, "ssl",lib_dirs, 857 ["/usr/local/ssl/lib", 858 "/usr/contrib/ssl/lib/" 859 ] ) 860 861 if (ssl_incs is not None and 862 ssl_libs is not None): 863 exts.append( Extension("_ssl", ["_ssl.c"], 864 include_dirs = ssl_incs, 865 library_dirs = ssl_libs, 866 libraries = ["ssl", "crypto"], 867 depends = ["socketmodule.h"]), ) 868 else: 869 missing.append("_ssl")
可以看到,setup.py会在"/usr/local/ssl/include","/usr/contrib/ssl/include/" 这两个目录里面搜索"openssl/ssl.h" 这个头文件,然后会在"/usr/local/ssl/lib" 和"/usr/contrib/ssl/lib/" 之中搜索 ssl 的 lib文件,搜索不到,会将_ssl加入missing这个数组里面,然后寻找missing调用的地方:
313 if missing: 314 print() 315 print("Python build finished successfully!") 316 print("The necessary bits to build these optional modules were not " 317 "found:") 318 print_three_column(missing) 319 print("To find the necessary bits, look in setup.py in" 320 " detect_modules() for the module"s name.") 321 print()
找到了上面报错时候的输出,很明显,是由于搜索不到ssl.h头文件或者搜索不到lib文件而导致的报错,但是我刚刚明明是装了openssl的啊,为啥还会报找不到呢?手动搜索下:
$ sudo find / -name ssl.h
没找到ssl.h,折腾了一番之后,找到了如下命令:
$ sudo yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel
可以看到,这个命令安装的是openssl-devel,与我之前安装的openssl有所不同,查阅资料之后发现,openssl只包含了可执行部分,openssl-devel才包含了头文件、头文件参考、某些库文件等跟开发相关的东西。所以只安装openssl是找不到相应的头文件的,安装完之后,再次编译:
$ make clean$ make... ...Python build finished successfully!The necessary bits to build these optional modules were not found:_dbm _gdbm _lzma To find the necessary bits, look in setup.py in detect_modules() for the module"s name.
果然发现,缺失的模块少了很多。
继续安装:
$ sudo make install
安装完之后,重新执行pip:
$ pip install numpyCollecting numpy Downloading /packages/68/1e/116ad560de97694e2d0c1843a7a0075cc9f49e922454d32f49a80eb6f1f2/numpy-1.14.5-cp36-cp36m-manylinux1_x86_64.whl (12.2MB) 6% |██ | 747kB 10kB/s eta 0:17:52
至此,pip安装报错的问题解决。