2016年1月14日 星期四

以 SOLVCON 專案為例,使用 conda 來維護、建立 python 執行與開發環境

一套可以正常運作的應用程式往往需要有很多其他配套的軟體互相支援,這造成了建構軟體中常見的「版本相依性」問題。如果是使用者的身份,這類問題可以透過(雖然這不一定是最好的方法)將所有相依的軟體都打成一包釋出。但身為開發者,常常遇到的問題是「開發者自己的作業系統環境」和「想開發的應用程式所需要的環境」有所不同。一般來說,開發者大概不太願意去更動自己的作業系統環境來配合自己的開發標的軟體,因為這可能會導致開發者自己的作業系統本身、或是作業系統下的其他應用程式無法正常運作。一個直觀的解決方案當然就是「那我弄一個專門給想開發的軟體使用的環境總可以了吧?」,conda 就是這樣的一個工具。

conda 是 anaconda 和 miniconda 所羅列的工具之一 。anaconda 和 miniconda 也是想做一樣的事情,但是前者可以堪稱是「包山包海」;這是優點也是缺點,優點就是一口氣把所有第三方的軟體都先準備好,以後幾乎不用再煩惱,缺點就是一定會準備了很多其實用不到的東西。miniconda 可以想像成是精簡版本的 anaconda 、然後有管理 python package 功能的 virtualenv[1]。

最近 SOLVCON 從原來的 python 2 移植到 python 3 ,主要的核心移植已經堪稱完成。然而最近想持續開發的 parallel 運算能力則在移植前便已經過時,剛好趁這次大搬家把這個 feature 修回來。

要熟悉一個程式的 feature,我還滿喜歡從研究它相關的 unittest 開始著手。理由如下:

從 unittest 中,我們可以看到
  1. 使用者的角度 - 這個功能如何被使用
  2. 測試者的角度 - 這個功能所產生的結果如何被解讀
有頭(如何 input 和使用)有尾(如何解讀 output)的情況下,就可以開始從外部行為來觀察程式執行 runtime 這個可以被視為黑盒子的部份。可以觀察外在的行為(unittest)加上可以觀察內在的行為(例如 source code)的話,幾乎就是一個說明清楚的 step by step tutorial。

有點扯太遠,總而言之要處理下面這兩件事情:
  1. 準備可以運行的 SOLVCON。SOLVCON 不再使用 scons 做套件管理(悲劇!!打包成 debian package 的 rule file 又要重寫 XD ),而改為使用 python setuptool ;因此要把對應的第三方工具告訴 setuptool。這裡我們採用 conda 當作解決方案。
  2. 利用 ftests 中的 nosetest 去研究和修復 SOLVCON 的平行運算功能。

準備好 conda 之後(這部份略過啦!好久以前就裝好了 XD 裝 anaconda 或是 miniconda 之後就有這個指令可以使用),先確認環境變數有告訴系統哪裡去找 conda 這個工具(通常是 anaconda 或是 miniconda 當初安裝的位置),例如有加入 PATH 變數。

啟動並且進入 conda 環境;我自己是把他寫成一個 alias 比較方便
alias solvconenv="export PATH=$MYLOCALINSTALLATION/miniconda3/solvcon-dev/bin:$PATH; source activate $MYLOCALINSTALLATION/miniconda3/solvcon-dev"

接著使用這個指令去安裝缺少的套件
conda search <package name>

安裝則是
conda install <package name>

例如安裝 python
conda install python
安裝 python3
conda install python=3
後面的等於3表示指定特定版本號碼。


更多使用方法請見 help
conda -h

[1] virtualenv 是用來建立獨立 python 套件環境的工具。









沒有留言:

張貼留言