iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 2
0
自我挑戰組

30 天不間斷-資工隨筆大雜燴系列 第 2

[Day 2] 在 Ubuntu 18.04 下打造自己的 Python 開發環境

前言

之前看到 Pycon 2018 的一場議程,改變了我目前使用 Python 建立環境的習慣。
然後最近發現大家都還是在用 pip 還有 virtualenv,希望能這次的機會順便推廣一下好用的套件管理工具XD

不過這一篇不會着墨 pipenv 的用法,主要是如何優雅的編譯安裝 python 以及安裝 pipenv ,pipenv 的相關用法之後有機會會再寫一篇介紹。

架構

1. Interpreters

Python直譯器

2. Tools

管理你開發環境會用到的東西 e.g. virtualenv,fabric

3. Dependencies

跟開發環境有關的東西 e.g. django,flask

4. Application

自己寫的程式

  • 架構順序爲由1~4,像迷宮般每層都有不同的工具,層層之間有些會重疊、有些可以共用、有些不能
  • 從出口解迷宮最簡單,因此瞭解這個架構的順序爲4~1
  • 第4點爲如何寫程式,不在本篇開發環境的討論範圍,因此從第3點開始解

Dependencies

  • virtual environment
  • 把開發環境和 Python 本體分離,需要用的時候 activate 環境就可以 import 需要的套件,停用的時候就 import 不了
  • A 專案用 Django 2.0,B 專案用 Django 2.6

Abstract Dependency 抽象依賴

更新方便

只要知道最少量地資訊就能自動安裝所有需要的底層套件

沒辦法更改特定版本

有些底層套件升級之後卻有bug,這時就沒辦法明確指定想要降級的版本

Concrete Dependency 實體化依賴

所有套件的版本皆可任意更改

明確指定所有定義(套件名稱、版本),可以明確的知道自己的開發環境長什麼樣子

更新麻煩

缺點是所有套件都要自己安裝,數量一多就很麻煩,如果某版本有安全性漏洞,必須要自己到官網尋找最新版本並把版本號碼寫入 requirements.txt 才能升級

軟體的建置是否只要看到定義就能完成

Virtualenv's bin/activate

  • 改系統 Python 的環境變數讓你可以 import 套件
  • 如果同時有不同的 environment 在運作,剛好 activate 錯環境的話,環境變數會被 inject 到原本的環境裏面,因此有可能無法回到乾淨的環境

Pipenv

只要在Pipfile寫好少量的抽象依賴(我要安裝什麼套件),就能自動在 Pipfile.lock 產生實體依賴(版本、建立時間...),因此有版本發生問題時就可以在Pipfile.lock 手動更改部分套件的版本。

我現在要一個 virtual env 管理我的所有套件,但是我要一個工具管理我的 virtual env,這個工具要怎麽裝?

所有virtualenv的東西都是正常的執行檔,所以不需要activate就可以用絕對路徑值

Tool

Venv 改寫

利用執行檔的特性,不用activate即可使用絕對路徑值
避免要先裝pipenv或是先用virtualenv 裝 pipenv 的問題

  1. 確定有以下兩個資料夾

    • ~/.local/bin: 之後會放到自己的 path 裏面,再symlink
    • ~/.local/venvs:底下放所有的虛擬環境
  2. ~/.local/venvs 底下建立名爲 pipenv 的虛擬環境(virtualenv)

  3. ~/.local/venvs/pipenv/bin/底下不activate執行 pip3 install pipenv (此時pipenv就會在local 環境且避免了要先裝pipenv還是先用venv再裝pipenv的問題)

記得使用 pip3 (for python3) 而不是 pip (for python2)

mkdir -p ~/.local/bin ~/.local/venvs
python3 -m venv ~/.local/venvs/pipenv
~/.local/venvs/pipenv/bin/pip3 install pipenv
ln -s ~/.local/venvs/pipenv/bin/pipenv ~/.local/bin
pipenv --version

Interpreter

Compile Python

大推pyenv 的 python-build

usage

python-build 3.6.5 ~/.local/pythons/3.6
python-build 3.5.4 ~/.local/pythons/3.5
ln -s ~/.local/pythons/3.6/bin/python3.6 ~/.local/bin (效果:執行python3.6時可以使用自己編譯的版本)
ln -s ~/.local/pythons/3.5/bin/python3.5 ~/.local/bin
#把~/.local/bin放到path的最前面,這樣使用的python3.5將會是自己build的版本

ln -s ~/.local/bin/python3.6 ~/.local/bin/python3 
把python3.6 symlink 到 python3,打python3就會得到python3.6)

不同的安裝指令

  1. apt: /usr/lib
  2. sudo pip install(建議不要執行此指令): /usr/local/lib
  3. pip install --user : /home/.local/lib

Problems

compile 3.7.4

WARNING: The Python bz2 extension was not compiled. Missing the bzip2 lib?
WARNING: The Python readline extension was not compiled. Missing the GNU readline lib?
WARNING: The Python sqlite3 extension was not compiled. Missing the SQLite3 lib?
Installed Python-3.7.4 to /home/cjchengtw/.local/pythons/3.7

Donwload python3 development environment

sudo apt install libsqlite3-dev

參考資料

https://datagrok.org/python/activate/
https://prassanna.io/blog/pyenv-and-pipenv-for-the-perfect-python-environment/


上一篇
[Day 1] HackdMD、GoodNotes、Notion 工作組合技
下一篇
[Day 3] Linux 檔案、目錄屬性權限(1)
系列文
30 天不間斷-資工隨筆大雜燴30

尚未有邦友留言

立即登入留言