舊酒換新瓶,新版M1/M2晶片Macos(Ventura)安裝古早版本Python2.7(Python2.x)

劉悅的技術部落格 發表於 2023-01-04
Python macOS

向下相容特性是軟體開發系統的一個重要指標,它是指一個新的系統或者軟體能夠與舊的系統或軟體相容並正常執行。這意味著舊系統或軟體可以在新系統或軟體中使用,而不會出現問題。向下相容對於提高軟體或系統的可用性非常重要,因為它允許使用者在不更換舊系統或軟體的情況下使用新系統或軟體。

我們知道MacOS系統從Monterey12.3版本起就移除了系統內建的Python2,更不消說最新的Ventura13.1了,但有時候我們依然需要古早版本的Python2.x來維護或者更新一些“祖傳專案”,不得不承認,這類低版本的“祖傳專案”在各種中大型企業內可謂是層出不窮,那麼在最新的Ventura13.1系統中,就得重新安裝Python2版本。

Docker構建Python2

最簡單的方式是透過Docker映象來構建Python2開發環境,透過使用容器,開發者可以輕鬆地將開發環境與應用程式隔離開來,這有助於避免依賴衝突和版本混亂。

直接拉取Python2的Docker映象檔案:

docker pull python:2.7.18-slim-stretch

隨後執行進入Python2命令列:

docker run -it --name python2 python:2.7.18-slim-stretch

程式返回:

➜  qiniu_async docker run -it --name python2 python:2.7.18-slim-stretch  
Python 2.7.18 (default, Apr 20 2020, 20:08:54)   
[GCC 6.3.0 20170516] on linux2  
Type "help", "copyright", "credits" or "license" for more information.  
>>>

當然了,構建開發環境並非只需要開啟命令列,還需要透過pip安裝一些古早版本的三方依賴,此時退出Python2命令列:

exit()

隨後檢視Python2的容器id

➜  ~ docker ps  
CONTAINER ID   IMAGE                        COMMAND     CREATED         STATUS         PORTS     NAMES  
41ef4af5169d   python:2.7.18-slim-stretch   "python2"   8 minutes ago   Up 5 minutes             python2  
➜  ~

進入容器內終端:

docker exec -it 41ef4af5169d /bin/sh

此時,就可是使用pip命令來安裝一些老版本的軟體了,比如說Django:

pip install [email protected]

程式返回:

DEPRECATION: Python 2.7 reached the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 is no longer maintained. A future version of pip will drop support for Python 2.7. More details about Python 2 support in pip, can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support  
Collecting django  
  Downloading Django-1.11.29-py2.py3-none-any.whl (6.9 MB)  
     |████████████████████████████████| 6.9 MB 8.9 MB/s   
Collecting pytz  
  Downloading pytz-2022.7-py2.py3-none-any.whl (499 kB)  
     |████████████████████████████████| 499 kB 20.7 MB/s   
Installing collected packages: pytz, django  
Successfully installed django-1.11.29 pytz-2022.7  
WARNING: You are using pip version 20.0.2; however, version 20.3.4 is available.  
You should consider upgrading via the '/usr/local/bin/python -m pip install --upgrade pip' command.  
# pip list  
DEPRECATION: Python 2.7 reached the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 is no longer maintained. A future version of pip will drop support for Python 2.7. More details about Python 2 support in pip, can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support  
Package    Version  
---------- -------  
Django     1.11.29  
pip        20.0.2   
pytz       2022.7   
setuptools 44.1.0   
wheel      0.34.2

安裝成功後,退出容器,然後提交更改:

# exit  
➜  qiniu_async docker commit 41ef python:2.7.18-slim-stretch  
sha256:119b30be68c806bdd4c74ffa3da115ba6ab144a91664a13e728c529c1fd5bca8

如此,就算容器被銷燬,再次透過映象啟動容器,也可以保留安裝的老版本軟體。

HomeBrew安裝虛擬環境構建Python2

如果不想使用Docker,也可以考慮Python虛擬環境,它是在主機作業系統之上的一個獨立的目錄,其中包含一套完全獨立的Python直譯器和一組庫和軟體包。它可以在不影響其他專案的情況下,為單個專案建立一套特定的執行環境。

首先安裝HomeBrew:

/bin/zsh -c "$(curl -fsSLhttps://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)”

隨後執行清理和升級:

brew cleanup && brew update

安裝虛擬環境:

brew install pyenv

隨後安裝需要的Python2版本:

pyenv install 2.7.18

接著新增環境變數:

echo 'PATH=$(pyenv root)/shims:$PATH' >> ~/.zshrc

之後就可以開啟虛擬環境了:

pyenv init

注意重啟終端後,就可以切換Python版本了:

pyenv shell 2.7.18

結語

Docker容器和Python虛擬環境都可以讓MacOs系統做到向下相容開發和維護古早專案,虛擬環境主要用於在同一臺機器上管理多個Python專案的依賴關係,而Docker容器則更適用於在不同的機器之間遷移應用程式和環境,可以在任何支援Docker的機器上執行該容器,而無需考慮底層作業系統的差異。