利用 conda 快速建立資料科學的 Python 環境
The easiest way to create Python environment for Data Science using conda
Introduction
建立環境是一件很重要卻很煩人的事情,有經驗的開發者會利用 Homebrew、yum、APT 等套件管理工具安裝 Python,當然也可以到 Python 官網直接下載 GUI 的安裝檔,最後再確定環境變數有正確的設定。
安裝好 Python 後,為了不污染系統本身的 Python2,一般來說都會利用 venv、virtualenv 或 pipenv 來建立 Python 的虛擬環境以達到彼此隔離的效果。
當 Python 安裝完成,Python 虛擬環境也搞定之後,就代表後面無事一身輕了嗎?代誌不是憨人所想的那麼簡單啦;哈哈哈,錯了!試想一個情境,當今天你正在使用 Python 3.6 進行系統開發、資料科學的分析或模型的建置,然後同時有一個舊專案必須使用 Python 3.4 維護,再然後你想要很潮的測試最新的 Python 3.7。
嗯⋯⋯,你當然可以安裝很多版本的 Python,同時,你要很清楚自己的機器的環境變數,然後再用類似 brew switch python 3.x.x
的方式進行切換。如果像我這樣對環境變數不是很熟,而且需要在不同平台上面跑資料科學專案時不就很煩。
所以下面就介紹我安裝與使用 conda 的過程。
Package, dependency and environment management for any language—Python, R, Ruby, Lua, Scala, Java, JavaScript, C/ C++, FORTRAN
在介紹頁中,conda
直接的跟你說它有多方便,conda
同時是套件管理、相依性管理與環境管理的工具,除了可以跨平台的運行在 Windows、macOS、Linux,也可以輕鬆的切換不同的 Python 版本。conda
已經直接包含在 Anaconda 與 Miniconda 中,所以不管安裝哪一種都可以。
Anaconda 在安裝的過程中,會一次幫你下載並安裝 720 以上資料科學常用的套件,安裝完成後就可以直接使用,適合初學者。Miniconda 則是 Anaconda 的最小化版本,使用者安裝後再依照自身需求安裝套件,適合硬碟容量小的使用者。
- For Miniconda—400 MB disk space.
- For Anaconda—Minimum 3 GB disk space to download and install.
由於安裝過程大同小異,所以後續使用 Miniconda 做為示範。
Installation on CentOS7
OS information:
# cat /etc/centos-release
CentOS Linux release 7.4.1708 (Core)
Login your account
sudo -i -u <user name>
Install Miniconda
Miniconda
下載最新的 bash installer
。
Miniconda installer archive
或是歷史資料庫選擇你想要的版本。
使用 wget
下載 Linux 版本的 bash installer
。
cd /tmp
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
Miniconda installer archive 中有提供各檔案的 MD5 雜湊值(hash value) 以確保下載的檔案是正確的。
$ md5sum Miniconda3-latest-Linux-x86_64.sh
718259965f234088d785cad1fbd7de03 Miniconda3-latest-Linux-x86_64.sh
執行該安裝檔
bash Miniconda3-latest-Linux-x86_64.sh
安裝完成後,預設是在登入時或開啟新 terminal 的時候自動啟動 base
這個環境。如果你不喜歡可以用以下的方法修改設定值。
conda config --set auto_activate_base false
If you’d prefer that conda’s
base
environment not be activated on startup, set the auto_activate_base parameter to false:
Installation on macOS
OS information:
macOS Mojave Version 10.14.3
Install Miniconda
Miniconda
依照平台下載最新的 GUI 安裝檔或是 bash
安裝檔,這邊我直接下載 .pkg
,然後無腦地一鍵安裝。
Miniconda installer archive
或是歷史資料庫選擇你想要的版本。
相同地,安裝完成後,如果你不喜歡自動啟動 base
這個環境,你可以用以下的方式修改設定值。
conda config --set auto_activate_base false
安裝完成後,在不同平台的使用方式都是一樣的,所以下面我使用 masOS 做為紀錄。
Managing environments
首先先檢查 conda
的路徑與版本。
Andrew-MacAir:~ Andrew$ which conda
/Users/Andrew/miniconda3/condabin/conda
Andrew-MacAir:~ Andrew$ conda --version
conda 4.6.14
conda info
這個指令可以檢查相關資訊,這邊可以看到我的 Python 版本、user config file 的路徑⋯⋯等等。
Andrew-MacAir:~ Andrew$ conda info
active environment : None
shell level : 0
user config file : /Users/Andrew/.condarc
populated config files : /Users/Andrew/.condarc
conda version : 4.6.14
conda-build version : not installed
python version : 3.7.3.final.0
base environment : /Users/Andrew/miniconda3 (writable)
channel URLs : https://repo.anaconda.com/pkgs/main/osx-64
https://repo.anaconda.com/pkgs/main/noarch
https://repo.anaconda.com/pkgs/free/osx-64
https://repo.anaconda.com/pkgs/free/noarch
https://repo.anaconda.com/pkgs/r/osx-64
https://repo.anaconda.com/pkgs/r/noarch
package cache : /Users/Andrew/miniconda3/pkgs
/Users/Andrew/.conda/pkgs
envs directories : /Users/Andrew/miniconda3/envs
/Users/Andrew/.conda/envs
platform : osx-64
user-agent : conda/4.6.14 requests/2.21.0 CPython/3.7.3 Darwin/18.5.0 OSX/10.14.4
UID:GID : 501:20
netrc file : None
offline mode : False
1. Checking the environments
conda info --env
或 conda env list
這兩個指令都可以列出機器裡面目前所有擁有的環境,預設安裝完後就會有一個 base
的環境。
Andrew-MacAir:~ Andrew$ conda env list
# conda environments:
#
base * /Users/Andrew/miniconda3
2. Activating/Deactivating the environments
擁有環境之後,首先要知道如何 進入/離開
conda 環境;
conda activate <the name of environment>
可以啟動你所需要的環境。
Andrew-MacAir:~ Andrew$ conda activate base
(base) Andrew-MacAir:~ Andrew$
這時候你會看到使用者名稱前面會多一個 (base)
,這就表示你正在使用 base
這個 conda 環境。然後檢查 Python 的路徑與版本,確定是使用 miniconda3
中的 Python 即可。
(base) Andrew-MacAir:~ Andrew$ which python
/Users/Andrew/miniconda3/bin/python
(base) Andrew-MacAir:~ Andrew$ python --version
Python 3.7.3
成功進入環境之後,conda deactivate
可以離開目前所在的 conda 環境。
(base) Andrew-MacAir:~ Andrew$ conda deactivate
Andrew-MacAir:~ Andrew$
3. Creating the environments
接著就開始建立自己所需要的 Python 環境啦!
3.1 從無到有開始
conda create -n <env name> python=x.x
這指令可以建立自己喜歡的環境名稱,並指定 Python 版本。
Andrew-MacAir:~ Andrew$ conda create -n technical-note python=3.6
Collecting package metadata: done
Solving environment: done
## Package Plan ##
environment location: /Users/Andrew/miniconda3/envs/technical-note
added / updated specs:
- python=3.6
The following NEW packages will be INSTALLED:
ca-certificates pkgs/main/osx-64::ca-certificates-2019.5.15-0
certifi pkgs/main/osx-64::certifi-2019.3.9-py36_0
libcxx pkgs/main/osx-64::libcxx-4.0.1-hcfea43d_1
libcxxabi pkgs/main/osx-64::libcxxabi-4.0.1-hcfea43d_1
libedit pkgs/main/osx-64::libedit-3.1.20181209-hb402a30_0
libffi pkgs/main/osx-64::libffi-3.2.1-h475c297_4
ncurses pkgs/main/osx-64::ncurses-6.1-h0a44026_1
openssl pkgs/main/osx-64::openssl-1.1.1c-h1de35cc_1
pip pkgs/main/osx-64::pip-19.1.1-py36_0
python pkgs/main/osx-64::python-3.6.8-haf84260_0
readline pkgs/main/osx-64::readline-7.0-h1de35cc_5
setuptools pkgs/main/osx-64::setuptools-41.0.1-py36_0
sqlite pkgs/main/osx-64::sqlite-3.28.0-ha441bb4_0
tk pkgs/main/osx-64::tk-8.6.8-ha441bb4_0
wheel pkgs/main/osx-64::wheel-0.33.4-py36_0
xz pkgs/main/osx-64::xz-5.2.4-h1de35cc_4
zlib pkgs/main/osx-64::zlib-1.2.11-h1de35cc_3
Proceed ([y]/n)?
過程中,conda
會檢查環境,並詢問你要不要安裝相關的套件,選擇 y
後就會開始安裝程序。安裝完成後,conda
會提示你如何 進入/離開
你剛剛所建立的環境(你剛剛已經會了)
Preparing transaction: done
Verifying transaction: done
Executing transaction: done
#
# To activate this environment, use
#
# $ conda activate technical-note
#
# To deactivate an active environment, use
#
# $ conda deactivate
在進入環境之前,先用 conda env list
來觀察一下你的環境清單,接著就可以開始隨心所欲地使用你的新環境啦。
Andrew-MacAir:~ Andrew$ conda env list
# conda environments:
#
base * /Users/Andrew/miniconda3
technical-note /Users/Andrew/miniconda3/envs/technical-note
3.2 利用事先定義好的 yml 檔
conda env create -f <yml name>
這指令可以依照檔案內容來建立正確的環境。
name: technical-note
channels:
- defaults
- conda-forge
- anaconda
dependencies:
- python=3.6
- pandas=0.24.2
- scikit-learn
在這個檔案中,你可以指定環境名稱(name
)、下載的來源(channels
)以及套件相關資訊(dependencies
),在套件資訊裡面你可以指定版本號,或是不指定版本讓 conda 自行尋找符合當下環境且不會衝突的版本。
利用這個方法除了可以方便地控管你的環境外,還可以分享給你的同事,以及在部署到 production
環境時,確保大家都是使用相同的版本。
當然,在開發的過程中,有可能會一直新增或刪減套件,當 yml 檔修正後,可以利用 conda env update -f <yml name>
指令來更新你的環境。
4. Removing the environments
4.1 在當下的環境中,移除某一個 package
conda remove <package name>
(technical-note) Andrew-MacAir:lab-python Andrew$ conda remove numpy
Collecting package metadata: done
Solving environment: done
## Package Plan ##
environment location: /Users/Andrew/miniconda3/envs/technical-note
removed specs:
- numpy
The following packages will be REMOVED:
mkl_fft-1.0.12-py36h5e564d8_0
numpy-1.16.4-py36hacdab7b_0
Proceed ([y]/n)?
4.2 在不進入環境的狀況下,移除某一個環境中的某一個 package
conda remove -n <env name> <package name>
Andrew-MacAir:lab-python Andrew$ conda remove -n technical-note numpy
Collecting package metadata: done
Solving environment: done
## Package Plan ##
environment location: /Users/Andrew/miniconda3/envs/technical-note
removed specs:
- numpy
The following packages will be REMOVED:
mkl_fft-1.0.12-py36h5e564d8_0
numpy-1.16.4-py36hacdab7b_0
Proceed ([y]/n)?
4.3 最後,當你不想要某一個環境,或是某一個環境被玩爛的時候,你可以把整個環境移除
conda remove -n <env name> --all
或是 conda env remove -n <env name>
Andrew-MacAir:~ Andrew$ conda remove -n technical-note --all
Remove all packages in environment /Users/Andrew/miniconda3/envs/technical-note:
## Package Plan ##
environment location: /Users/Andrew/miniconda3/envs/technical-note
The following packages will be REMOVED:
ca-certificates-2019.5.15-0
certifi-2019.3.9-py36_0
libcxx-4.0.1-hcfea43d_1
libcxxabi-4.0.1-hcfea43d_1
libedit-3.1.20181209-hb402a30_0
libffi-3.2.1-h475c297_4
ncurses-6.1-h0a44026_1
openssl-1.1.1c-h1de35cc_1
pip-19.1.1-py36_0
python-3.6.8-haf84260_0
readline-7.0-h1de35cc_5
setuptools-41.0.1-py36_0
sqlite-3.28.0-ha441bb4_0
tk-8.6.8-ha441bb4_0
wheel-0.33.4-py36_0
xz-5.2.4-h1de35cc_4
zlib-1.2.11-h1de35cc_3
Proceed ([y]/n)? y
Preparing transaction: done
Verifying transaction: done
Executing transaction: done
Andrew-MacAir:~ Andrew$ conda env list
# conda environments:
#
base * /Users/Andrew/miniconda3
Leave a comment