1. 源碼下載
從https://www.python.org/下載源碼。
我這裏下載最新的 Python3.7.4。
2. Linux(服務器)版本的Python3.7 編譯並安裝:
命令如下:
$ tar -xzvf Python-3.7.4.tgz
$ cd Python-3.7.4/
$ mkdir build
$cd build
$../configure --prefix=/usr
$make -j8
$sudo make install
錯誤1:
Failed to build these modules:
_ctypes
解決:
sudo apt-get install libffi-dev
錯誤2:
Could not build the ssl module!
Python requires an OpenSSL 1.0.2 or 1.1 compatible libssl with X509_VERIFY_PARAM_set1_host().
LibreSSL 2.6.4 and earlier do not provide the necessary APIs, https://github.com/libressl-portable/portable/issues/381
解決:
下載libressl最新穩定版本 2.7.4
https://ftp.openbsd.org/pub/OpenBSD/LibreSSL/libressl-2.7.4.tar.gz
解壓:
tar -xzvf libressl-2.7.4.tar.gz
編譯安裝:
$ cd libressl-2.7.4
$ ./configure
$ make -j8
$ sudo make install
新建或修改 /etc/ld.so.conf.d/local.conf 配置文件,添加如下內容:
/usr/local/lib
即將 /usr/local/lib 目錄加入到模塊加載目錄。
重新加載共享模塊:
$ sudo ldconfig -v
$ openssl version
LibreSSL 2.7.4
回到 Python-3.7.4 目錄,編輯安裝文件 Modules/Setup.dist
去掉有關 ssl 編譯代碼的註釋,共 4 行,並修改 SSL 目錄爲 SSL=/usr/local, 如下所示:
# 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.c \
-DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
-L$(SSL)/lib -lssl -lcrypto
重新配置、編譯。
錯誤3:
Exception:
Traceback (most recent call last):
File "/tmp/tmpy1hw1kin/pip-19.0.3-py2.py3-none-any.whl/pip/_internal/cli/base_command.py", line 179, in main
status = self.run(options, args)
File "/tmp/tmpy1hw1kin/pip-19.0.3-py2.py3-none-any.whl/pip/_internal/commands/install.py", line 255, in run
with self._build_session(options) as session:
File "/tmp/tmpy1hw1kin/pip-19.0.3-py2.py3-none-any.whl/pip/_internal/cli/base_command.py", line 93, in _build_session
insecure_hosts=options.trusted_hosts,
File "/tmp/tmpy1hw1kin/pip-19.0.3-py2.py3-none-any.whl/pip/_internal/download.py", line 344, in __init__
self.headers["User-Agent"] = user_agent()
File "/tmp/tmpy1hw1kin/pip-19.0.3-py2.py3-none-any.whl/pip/_internal/download.py", line 108, in user_agent
zip(["name", "version", "id"], distro.linux_distribution()),
File "/tmp/tmpy1hw1kin/pip-19.0.3-py2.py3-none-any.whl/pip/_vendor/distro.py", line 120, in linux_distribution
return _distro.linux_distribution(full_distribution_name)
File "/tmp/tmpy1hw1kin/pip-19.0.3-py2.py3-none-any.whl/pip/_vendor/distro.py", line 675, in linux_distribution
self.version(),
File "/tmp/tmpy1hw1kin/pip-19.0.3-py2.py3-none-any.whl/pip/_vendor/distro.py", line 735, in version
self.lsb_release_attr('release'),
File "/tmp/tmpy1hw1kin/pip-19.0.3-py2.py3-none-any.whl/pip/_vendor/distro.py", line 892, in lsb_release_attr
return self._lsb_release_info.get(attribute, '')
File "/tmp/tmpy1hw1kin/pip-19.0.3-py2.py3-none-any.whl/pip/_vendor/distro.py", line 550, in __get__
ret = obj.__dict__[self._fname] = self._f(obj)
File "/tmp/tmpy1hw1kin/pip-19.0.3-py2.py3-none-any.whl/pip/_vendor/distro.py", line 998, in _lsb_release_info
stdout = subprocess.check_output(cmd, stderr=devnull)
File "/media/xxt/install/Python-3.7.4/Lib/subprocess.py", line 395, in check_output
**kwargs).stdout
File "/media/xxt/install/Python-3.7.4/Lib/subprocess.py", line 487, in run
output=stdout, stderr=stderr)
subprocess.CalledProcessError: Command '('lsb_release', '-a')' returned non-zero exit status 1.
解決辦法:
找到lsb_release.py文件和CommandNotFound目錄,把它們拷貝到報的錯誤中subprocess.py所在文件夾
$find /usr/ -name lsb_release.py
/usr/lib/python3.7/lsb_release.py
/usr/lib/python2.7/dist-packages/lsb_release.py
/usr/lib/python3/dist-packages/lsb_release.py
/usr/share/pyshared/lsb_release.py
$ cp /usr/share/pyshared/lsb_release.py /media/xxt/install/Python-3.7.4/Lib
Python3 查看:
python3
Python 3.7.4 (default, Aug 1 2019, 10:26:11)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
安裝成功,結束。
3. 切換版本:
基於用戶修改 Python 版本:
想要爲某個特定用戶修改 Python 版本,只需要在其 home 目錄下創建一個 alias(別名) 即可。打開該用戶的 ~/.bashrc 文件,添加新的別名信息來修改默認使用的 Python 版本。
alias python='/usr/bin/python3.7'
一旦完成以上操作,重新登錄或者重新加載 .bashrc 文件,使操作生效。
檢查當前的 Python 版本。
$ python --version
Python 3.7.4