iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 28
0

前言

還記得很久以前寫過一篇 python 開發環境嗎~

之前忘記介紹 pipenv 的使用方法了所以現在趕快來補一篇XD

Why Pipenv

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

特性

  • Pipenv 會自動對特定的虛擬環境做mapping
  • 專案的虛擬環境名稱 = 專案根目錄名稱+專案根目錄的絕對路徑所產生的 Hash(e.g., my_project-soe459)

安裝

pip3 install pipx
pipx install pipenv

常用指令

  • 安裝套件

    pipenv install

`pipenv uninstall`
`pipenv run`
`pipenv lock`
`pipenv shell`

pipenv graph

  • 根據PEP 508檢查安全性風險

    pipenv check

```
pipenv --three #python 3
pipenv --two   #python 2 
pipenv --python 3.6 #安裝指定的 python 版本
```
  • 刪除虛擬環境

    pipenv --rm

使用技巧

導入 requirements.txt

執行pipenv install時,如果此專案本身有包含 requirement.txt 時,裏面的套件版本訊息將會自動導入 Pipfile 並執行安裝。

或是加上參數 -r 並加上後面的文件路徑 $ pipenv install -r path/to/requirements.txt

相容 requirements.txt

  • 從 Pipfile 和 Pipfile.lock 文件來產生 requirements.txt

    $ pipenv lock -r

  • 區分 development 和 production 階段

    pipenv install django #production
    pipenv install flask --dev #development
    

安裝特定版本

$ pipenv install requests==2.13.0

將自動更新到 Pipfile 文件

自定虛擬環境的儲存位置

預設情況虛擬環境聚集在 /home/$username/.local/share/virtualenvs,因此如果要更換虛擬環境儲存位置的話

  1. 固定在專案的根目錄建立 .venv

    在你的.bashrc/.zshrc(或任何shell的設定檔)加上

    export PIPENV_VENV_IN_PROJECT=1

  2. 透過環境變數 WORKON_HOME 告訴 pipenv 你的虛擬環境應該存在哪裏

    export WORKON_HOME=~/.venvs

環境變數檔案 .env

當需要建立環境變數時,可以在專案根目錄底下建立 .env,當執行 pipenv run$ pipenv shell 會自動讀取

pipenv 預設從專案根目錄尋找 .env,因此也可以設定 PIPENV_DOTENV_LOCATION 來更改位置

如果不想要 pipenv 讀取 .env,把 PIPENV_DONT_USE_PYENV 設爲 1

$ cat .env

SoraAoi=GOOD

$ pipenv run python

Loading .env environment variables…
Python 3.7.3 (default, Apr 13 2019, 13:33:57) 
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.environ['SoraAoi']
'GOOD'

.env 如果包含隱私資訊,切忌提交到版本控制系統ㄛ

瀏覽模組的原生程式碼

$ pipenv open pandas

使用自己 build 的 python 版本建立環境

$> which python3`

~/.local/bin/python3

$>pipenv --python $(which python3)

就會開始在 .local 底下使用自己編譯的 python 版本建立 Pipfile Pipfile.lock 來建立虛擬環境

使用流程

  1. 進去專案目錄

  2. pipenv install
    這時會看到Pipfile還有Pipfile.lock

  3. 裝套件時 pipenv install packages

  4. 進去虛擬環境 pipenv shell

  5. 退出虛擬環境 exit
    切忌不能用`deactivate
    否則會出現

    Shell for UNKNOWN_VIRTUAL_ENVIRONMENT already activated.
    No action taken to avoid nested environments.

  6. 在虛擬環境下執行腳本pipenv run python xxx.py

目前遇到的問題或採過的雷

有時後在寫入並更新 Pipfile.lock 的時間過久


可靠解法

--
跳過 locking 階段,直接下載套件

  • 加入參數 --skip-lock

  • PIPENV_SKIP_LOCK 設爲 1

    • 只會影響 install 還有 uninstall 指令

改專案名稱或路徑會切割原本的虛擬環境

改變專案路徑會破壞原本預設的 mapping ,pipenv將會和專案的虛擬環境一刀兩斷,因此在專案目錄下新建虛擬環境時,你的.bashrc/.zshrc(或任何shell的設定檔)應該要加上export PIPENV_VENV_IN_PROJECT=1來避免因為路徑改變而產生任何問題。
參考這篇issue

參考資料

https://docs.pipenv.org/
https://crazygit.wiseturtles.com/2018/01/08/pipenv-tour/
https://medium.com/@johnnyellisjohnny/pipenv%E6%8C%87%E4%BB%A4%E5%A4%A7%E5%85%A8-6e4415cc8a15
https://segmentfault.com/a/1190000015143431#articleHeader11
https://blog.aweimeow.tw/use-pyenv-pipenv-to-archieve-clean-environment/
https://datagrok.org/python/activate/
https://pipenv.readthedocs.io/en/latest/
https://speakerdeck.com/uranusjr/zhe-yang-de-kai-fa-huan-jing-mei-wen-ti-ma


上一篇
[Day 27] 自己的 Shell Script 自己寫 - 資料重導向
下一篇
[Day 29] 自己的 Shell Script 自己寫 - 備份刪除檔案
系列文
30 天不間斷-資工隨筆大雜燴30

尚未有邦友留言

立即登入留言