作為開發人員,通常是離不開Python環境的(即便你是Java-er、Js-er、Php-er .etc.)。
為何要保留Python2
Mac大多自帶了python 2的環境,但是Python2在2020年1月1號已經EOF了。所以現在主流是python 3,但是我們又不能馬上卸載python 2,因為還有很多軟件包是基於python 2的(這點很無奈,只能等Apple完全移除Python2依賴)。於是,我們就要在保留python 2的情況下再安裝一套python 3環境。
Python3發行版選擇
通常我們講的Python是指官方的CPython版本,這個版本提供了最基礎、最通用的功能實現。但是這個版本默認缺少很多高級特性,例如虛擬環境、JIT、數學計算相關軟件包等,需要使用者在安裝后自行設置或安裝。這就很耗費時間了,因此我選擇了Anaconda Python的版本。
更多發行版對比可以參考 關於各Python發行版,我們需要了解的一切。
安裝Anaconda
Homebrew在cask中已經集成了Anaconda
$ brew search anaconda
==> Casks
anaconda ✔
$ brew cask info anaconda
anaconda: 2019.10 (auto_updates)
https://www.anaconda.com/
/usr/local/Caskroom/anaconda/2019.10 (424.2MB)
From: https://mirrors.ustc.edu.cn/homebrew-cask.git
==> Name
Continuum Analytics Anaconda
==> Artifacts
Anaconda3-2019.10-MacOSX-x86_64.sh (Installer)
==> Caveats
Cask anaconda installs files under /usr/local. The presence of such
files can cause warnings when running `brew doctor`, which is considered
to be a bug in Homebrew Cask.
因此我們只需要通過brew cask install anaconda就能很簡單的完成安裝。
環境切換
anaconda默認安裝到了/usr/local/anaconda3,可以通過以下命令設置環境變量:
$ echo 'export PATH=/usr/local/anaconda3/bin:$PATH' >> ~/.bash_profile
$ source ~/.bash_profile
此時在終端執行python就會看到默認python環境已被切換到Anaconda:
$ python
Python 3.7.4 (default, Aug 13 2019, 15:17:50)
[Clang 4.0.1 (tags/RELEASE_401/final)] :: Anaconda, Inc. on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
那么Python2環境去哪了呢?別慌,只是python命令鏈接到了Anaconda,原來的Python2環境絲毫不受影響,通過python2就能喚起:
$ python2
WARNING: Python 2.7 is not recommended.
This version is included in macOS for compatibility with legacy software.
Future versions of macOS will not include Python 2.7.
Instead, it is recommended that you transition to using 'python3' from within Terminal.
Python 2.7.16 (default, Nov 9 2019, 05:55:08)
[GCC 4.2.1 Compatible Apple LLVM 11.0.0 (clang-1100.0.32.4) (-macos10.15-objc-s on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
如果你想把默認Python環境改回到Python2,只需執行以下命令:
$ echo 'alias python="/usr/bin/python"' >> ~/.bash_profile
$ source ~/.bash_profile
再次執行pyhton就會變回Python2環境了
$ python
WARNING: Python 2.7 is not recommended.
This version is included in macOS for compatibility with legacy software.
Future versions of macOS will not include Python 2.7.
Instead, it is recommended that you transition to using 'python3' from within Terminal.
Python 2.7.16 (default, Nov 9 2019, 05:55:08)
[GCC 4.2.1 Compatible Apple LLVM 11.0.0 (clang-1100.0.32.4) (-macos10.15-objc-s on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
此時啟動Anaconda就需要用python3命令了:
$ python3
Python 3.7.4 (default, Aug 13 2019, 15:17:50)
[Clang 4.0.1 (tags/RELEASE_401/final)] :: Anaconda, Inc. on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
設置國內鏡像源
和其他包管理器一樣,Anaconda自帶的conda以及pip也需要設置國內鏡像。不久前中科大的鏡像停止更新Anaconda源,截止我寫這篇blog為止都未恢復,詳見 Anaconda 源使用幫助。幸而清華大學的鏡像已經恢復了更新,詳見Anaconda 相關鏡像已恢復。
conda源設置
首先創建.condarc配置文件:
$ conda config --set show_channel_urls yes
然后參考Anaconda 鏡像使用幫助修改.condarc文件即可。
pip源設置
和conda一樣,這里使用清華大學的源,參考pypi 鏡像使用幫助
$ pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pip -U
$ pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
Anaconda使用
以下說明均在默認python環境為anaconda的情況下。
# ~ [15:49:51]
$ python --version
Python 3.7.4
# ~ [15:49:55]
$ python
Python 3.7.4 (default, Aug 13 2019, 15:17:50)
[Clang 4.0.1 (tags/RELEASE_401/final)] :: Anaconda, Inc. on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
虛擬環境
anaconda支持管理多個python虛擬環境。
創建虛擬環境
創建一個環境的方法很簡單,例如創建python2.7的環境:
conda create --name python27 python=2.7
anaconda在准備好后,會請求在/usr/local/anaconda3/evns/python27中安裝最新版的python 2.7.x :
$ conda create --name python27 python=2.7
Collecting package metadata (current_repodata.json): done
Solving environment: done
## Package Plan ##
environment location: /usr/local/anaconda3/envs/python27
added / updated specs:
- python=2.7
The following packages will be downloaded:
package | build
---------------------------|-----------------
ca-certificates-2019.11.27 | 0 131 KB defaults
certifi-2019.11.28 | py27_0 156 KB defaults
libcxx-4.0.1 | hcfea43d_1 947 KB defaults
libcxxabi-4.0.1 | hcfea43d_1 350 KB defaults
libedit-3.1.20181209 | hb402a30_0 136 KB defaults
libffi-3.2.1 | h475c297_4 37 KB defaults
ncurses-6.1 | h0a44026_1 732 KB defaults
pip-19.3.1 | py27_0 1.9 MB defaults
python-2.7.17 | h97142e2_0 9.3 MB defaults
readline-7.0 | h1de35cc_5 316 KB defaults
setuptools-44.0.0 | py27_0 513 KB defaults
sqlite-3.30.1 | ha441bb4_0 2.4 MB defaults
tk-8.6.8 | ha441bb4_0 2.8 MB defaults
wheel-0.33.6 | py27_0 40 KB defaults
zlib-1.2.11 | h1de35cc_3 90 KB defaults
------------------------------------------------------------
Total: 19.7 MB
The following NEW packages will be INSTALLED:
ca-certificates anaconda/pkgs/main/osx-64::ca-certificates-2019.11.27-0
certifi anaconda/pkgs/main/osx-64::certifi-2019.11.28-py27_0
libcxx anaconda/pkgs/main/osx-64::libcxx-4.0.1-hcfea43d_1
libcxxabi anaconda/pkgs/main/osx-64::libcxxabi-4.0.1-hcfea43d_1
libedit anaconda/pkgs/main/osx-64::libedit-3.1.20181209-hb402a30_0
libffi anaconda/pkgs/main/osx-64::libffi-3.2.1-h475c297_4
ncurses anaconda/pkgs/main/osx-64::ncurses-6.1-h0a44026_1
pip anaconda/pkgs/main/osx-64::pip-19.3.1-py27_0
python anaconda/pkgs/main/osx-64::python-2.7.17-h97142e2_0
readline anaconda/pkgs/main/osx-64::readline-7.0-h1de35cc_5
setuptools anaconda/pkgs/main/osx-64::setuptools-44.0.0-py27_0
sqlite anaconda/pkgs/main/osx-64::sqlite-3.30.1-ha441bb4_0
tk anaconda/pkgs/main/osx-64::tk-8.6.8-ha441bb4_0
wheel anaconda/pkgs/main/osx-64::wheel-0.33.6-py27_0
zlib anaconda/pkgs/main/osx-64::zlib-1.2.11-h1de35cc_3
Proceed ([y]/n)?
同意后會執行下載安裝:
Downloading and Extracting Packages
libffi-3.2.1 | 37 KB | ################################################################################################################################################################### | 100%
pip-19.3.1 | 1.9 MB | ################################################################################################################################################################### | 100%
readline-7.0 | 316 KB | ################################################################################################################################################################### | 100%
ca-certificates-2019 | 131 KB | ################################################################################################################################################################### | 100%
sqlite-3.30.1 | 2.4 MB | ################################################################################################################################################################### | 100%
tk-8.6.8 | 2.8 MB | ################################################################################################################################################################### | 100%
certifi-2019.11.28 | 156 KB | ################################################################################################################################################################### | 100%
ncurses-6.1 | 732 KB | ################################################################################################################################################################### | 100%
libedit-3.1.20181209 | 136 KB | ################################################################################################################################################################### | 100%
libcxx-4.0.1 | 947 KB | ################################################################################################################################################################### | 100%
libcxxabi-4.0.1 | 350 KB | ################################################################################################################################################################### | 100%
zlib-1.2.11 | 90 KB | ################################################################################################################################################################### | 100%
setuptools-44.0.0 | 513 KB | ################################################################################################################################################################### | 100%
python-2.7.17 | 9.3 MB | ################################################################################################################################################################### | 100%
wheel-0.33.6 | 40 KB | ################################################################################################################################################################### | 100%
Preparing transaction: done
Verifying transaction: / WARNING conda.core.path_actions:verify(963): Unable to create environments file. Path not writable.
environment location: /Users/zhang/.conda/environments.txt
done
Executing transaction: \ WARNING conda.core.envs_manager:register_env(52): Unable to register environment. Path not writable or missing.
environment location: /usr/local/anaconda3/envs/python27
registry file: /Users/zhang/.conda/environments.txt
done
#
# To activate this environment, use
#
# $ conda activate python27
#
# To deactivate an active environment, use
#
# $ conda deactivate
可以看到有警告(影響conda activate / conda deactivate切換環境,雖然可以用source activate / source deactivate代替)
Verifying transaction: / WARNING conda.core.path_actions:verify(963): Unable to create environments file. Path not writable.
environment location: /Users/zhang/.conda/environments.txt
done
Executing transaction: \ WARNING conda.core.envs_manager:register_env(52): Unable to register environment. Path not writable or missing.
environment location: /usr/local/anaconda3/envs/python27
registry file: /Users/zhang/.conda/environments.txt
done
這個是因為Homebrew在安裝anaconda時自動以root賬戶創建了~/.conda,而當前用戶權限不足導致的,解決方法很簡單,就是把這個目錄下的文件權限全部改成當前用戶可編輯:
$ sudo chmod 777 ~/.conda/*
然后刪除有問題的環境並重建:
$ conda remove -n python27 --all
$ conda create --name python27 python=2.7
切換虛擬環境
安裝完成后其實anaconda已經提示如何切換環境了:
#
# To activate this environment, use
#
# $ conda activate python27
#
# To deactivate an active environment, use
#
# $ conda deactivate
按照提示切換到python27環境,並用python --version驗證:
# ~ [16:45:54]
$ conda activate python27
(python27)
# ~ [16:48:06]
$ python --version
Python 2.7.17 :: Anaconda, Inc.
(python27)
退出python27環境,並用python --version驗證:
# ~ [16:53:10]
$ conda deactivate
# ~ [16:53:25]
$ python --version
Python 3.7.4
查詢虛擬環境
conda info -e可以列出所有環境。
包管理
anaconda默認有兩個包管理器conda和pip,conda是跨環境統一的,但是pip是各個環境隔離的。
默認的Python3環境:
# ~ [17:12:31]
$ conda info
active environment : None
shell level : 0
user config file : /Users/zhang/.condarc
populated config files : /Users/zhang/.condarc
conda version : 4.7.12
conda-build version : 3.18.9
python version : 3.7.4.final.0
virtual packages :
base environment : /usr/local/anaconda3 (writable)
channel URLs : https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/osx-64
https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/noarch
https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/osx-64
https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/noarch
https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r/osx-64
https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r/noarch
package cache : /usr/local/anaconda3/pkgs
/Users/zhang/.conda/pkgs
envs directories : /usr/local/anaconda3/envs
/Users/zhang/.conda/envs
platform : osx-64
user-agent : conda/4.7.12 requests/2.22.0 CPython/3.7.4 Darwin/19.2.0 OSX/10.15.2
UID:GID : 501:20
netrc file : None
offline mode : False
# ~ [17:12:36]
$ pip --version
pip 19.3.1 from /usr/local/anaconda3/lib/python3.7/site-packages/pip (python 3.7)
切到Python27環境后:
# ~ [17:06:10]
$ conda info
active environment : python27
active env location : /usr/local/anaconda3/envs/python27
shell level : 1
user config file : /Users/zhang/.condarc
populated config files : /Users/zhang/.condarc
conda version : 4.7.12
conda-build version : 3.18.9
python version : 3.7.4.final.0
virtual packages :
base environment : /usr/local/anaconda3 (writable)
channel URLs : https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/osx-64
https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/noarch
https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/osx-64
https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/noarch
https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r/osx-64
https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r/noarch
package cache : /usr/local/anaconda3/pkgs
/Users/zhang/.conda/pkgs
envs directories : /usr/local/anaconda3/envs
/Users/zhang/.conda/envs
platform : osx-64
user-agent : conda/4.7.12 requests/2.22.0 CPython/3.7.4 Darwin/19.2.0 OSX/10.15.2
UID:GID : 501:20
netrc file : None
offline mode : False
(python27)
# ~ [17:06:22]
$ pip --version
pip 19.3.1 from /usr/local/anaconda3/envs/python27/lib/python2.7/site-packages/pip (python 2.7)
(python27)
可以很明顯的看出兩者在環境隔離方面的差異。因此,每當創建一個虛擬環境,都需要重新設置一下pip的國內鏡像
$ pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pip -U
$ pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
軟件包安裝
因為pip是各個環境獨立一套的,因此和單個環境使用沒有任何區別,軟件包也是安裝到各個虛擬環境的/site-packages/目錄下,例如/usr/local/anaconda3/envs/python27/lib/python2.7/site-packages/。
conda因為各個環境共用一套,所以在執行時需要指定環境,不指定就默認為當前活躍環境:
# 查看當前環境下已安裝的包
conda list
# 查看某個指定環境的已安裝包
conda list -n python27
# 查找package信息
conda search numpy
# 安裝package
conda install -n python27 numpy
# 如果不用-n指定環境名稱,則被安裝在當前活躍環境
# 也可以通過-c指定通過某個channel安裝
# 更新package
conda update -n python27 numpy
# 刪除package
conda remove -n python27 numpy
conda也能管理conda、python、anaconda的版本:
# 更新conda,保持conda最新
conda update conda
# 更新anaconda
conda update anaconda
# 更新python
conda update python
# 假設當前環境是python 3.7, conda會將python升級為3.7.x系列的當前最新版本
IDE設置
開發總是離不開IDE,這里僅介紹PyCharm的設置,VS Code可以參考官方文檔Using Python environments in VS Code。
PyCharm
首先需要先創建好虛擬環境,還是以python27這個環境為例。
創建Project時選擇環境
-
打開PyCharm,選擇Create New Project
-
修改項目的名字,然后選擇Project Interpreter》Existing Interpreter>...

-
選擇Conda Environment==》... ,設置為之前創建的python27環境的文件夾

-
創建完工程,然后新建一個python文件,輸出Hello world:
print("Hello world")
已有Project修改環境



