Python 管理哪家強?

僱個城管打天下發表於2019-03-15

之前介紹過《利用pyenv管理多個版本的python》,pyenv 是一個非常好用的 Python 版本管理工具,利用它我們可以在同一臺電腦上安裝多個版本的 Python ,這個過程非常簡單。Mac系統的電腦一行命令就可以安裝了:

brew install pyenv
複製程式碼

pyenv 的安裝和使用詳見開篇提到的文章,這裡不再贅述。

今天主要是想介紹另一個非常好用的 Python 工具——"Pipenv"

Pipenv是什麼?

Pipenv is a tool that aims to bring the best of all packaging worlds (bundler, composer, npm, cargo, yarn, etc.) to the Python world. Windows is a first-class citizen, in our world.

It automatically creates and manages a virtualenv for your projects, as well as adds/removes packages from your Pipfile as you install/uninstall packages. It also generates the ever-important Pipfile.lock, which is used to produce deterministic builds.

上段引用自官方文件,簡單來說就是 Pipenv 是希望成為 Python 界最好的包管理工具,成為 Python 界的 npm。你可以使用 Pipenv 這一個工具來安裝、解除安裝、跟蹤和記錄依賴性,並建立、使用和組織你的虛擬環境。 當你使用它啟動一個專案時,如果你還沒有使用虛擬環境的話,Pipenv 將自動為該專案建立一個虛擬環境。 Pipenv 使用 PipfilePipfile.lock 來管理依賴包,並且在使用 pipenv 新增或刪除包時,自動維護 Pipfile 檔案,同時生成 Pipfile.lock 來鎖定安裝包的版本和依賴資訊,避免構建錯誤。相比pip需要手動維護requirements.txt 中的安裝包和版本,具有很大的進步。

為什麼要使用 Pipenv

設想一個場景:你手頭有多個開發專案,其中專案 A 和專案 B 要求用 Python3,專案C需要用 Python2,而專案 A 和專案 B 又要求第三方依賴包相互獨立,互不干擾。

這個時候,為了滿足版本的不同我們需要使用 Pyenv 安裝多個版本的 Python ,同時為了使不同專案之間隔離開來,我們可以使用 Pipenv 建立虛擬的開發環境。

那有的人就要問了,virtualenv不就可以建立虛擬環境了嗎,為什麼還要使用 Pipenv ,這裡先賣個關子,文末我再來比較這些常見工具之間的差異性。

使用 Pipenv

安裝 Pipenv

如果你是Mac電腦,那麼推薦使用Homebrew來安裝。

brew install pipenv
複製程式碼

如果不是Mac電腦,建議 使用Python3的pip3 安裝:

pip3 install pipenv
複製程式碼

執行pipenv,可以檢視pipenv的幫助資訊:

pipenv
複製程式碼

如果出現如下資訊,就說明安裝成功了:

image-20190315112449577

為專案建立虛擬環境

預設地,虛擬環境會建立在~/.local/share/virtualenvs目錄裡面。 如果我們希望在每個專案的根目錄下儲存虛擬環境目錄(.venv),需要在 .bashrc.bash_profile 中配置如下:

export PIPENV_VENV_IN_PROJECT=1
複製程式碼

要想使配置生效,執行下source ~/.bashrc或者source ~/.bash_profile即可使環境變數生效。 接下來我們為專案建立虛擬環境。

mkdir pipenv_demo		
cd pipenv_demo
pipenv --python 3.6.7 # 為當前初始化一個版本為 3.6.7 的python環境
複製程式碼

首次執行

如果是第一次在專案中執行 pipenv 命令的話,會在專案中建立一個名為 Pipfile 的檔案,檔案內容類似下面這樣。

[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]
requests-html = "*"

[dev-packages]

[requires]
python_version = "3.7"
複製程式碼

這個檔案就類似於 maven 中的 pom.xml、npm 中的 package.json 檔案。如果執行過install、update等命令的話,還會建立一個Pipfile.lock檔案,類似npm中的lock檔案。這兩個檔案就是pipenv用於管理第三方庫的配置檔案,如果同時使用版本控制軟體的話,需要將它們也加入進去。

Tips:對於這個檔案我們需要先做一件事,就是更改 [[source]] 中的 url 為國內映象。

[[source]]
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
複製程式碼

常用命令

安裝專案依賴

如果我想在專案中安裝requests這個包,執行:

pipenv install requests
複製程式碼

如果需要指定具體版本號,可以這樣:

pipenv install requests==2.13.0
複製程式碼

如果是第一次執行pipenv的話,會先建立Pipfile檔案,否則會修改Pipfile檔案。

該命令還有一個常用引數-d或--dev,用於安裝僅供開發使用的包。

Tips:用 git 管理專案時候,要把 PipfilePipfile.lock 加入版本跟蹤。這樣 clone 了這個專案的同學,只需要執行

pipenv install
複製程式碼

就可以安裝所有的Pipfile中 [packages]部分的包了,並且自動為專案在自己電腦上建立了虛擬環境。

解除安裝某個依賴

相應的還有命令來解除安裝第三方包,該命令還有兩個引數--all--all-dev用於解除安裝所有包和所有開發包。

pipenv uninstall requests
複製程式碼

更新專案依賴

檢視所有需要更新的包:

pipenv update --outdated

複製程式碼

更新所有包:

pipenv update
複製程式碼

更新指定的包:

pipenv update <包名>
複製程式碼

其他命令

pipenv -h  # 檢視幫助
pipenv graph  # 檢視已安裝的包
pipenv shell  # 啟動shell
pipenv run python hello.py  # 執行指令碼
複製程式碼

Python 管理哪家強?

還記得在最開始提出的問題嗎?明明virtualenv就可以建立虛擬環境了嗎,為什麼還要使用 Pipenv 呢?

接下來我們來橫向對比下幾個常見的容易弄混的 python 管理工具(我在初學的時候總是分不清?)

工具 介紹 原理
pip 包管理工具
virtualenv 虛擬環境管理工具 切換目錄
virtualenvwrapper 虛擬環境管理工具加強版
pyenv python版本管理工具 修改環境變數
pyenv-virtualenv 虛擬環境管理工具
pipenv 專案環境管理工具
anaconda 一個包含180+的科學包及其依賴項的發行版本(不只是 Python 可用)

同時在推薦一個我在 stackoverflow 上看到的回答:What is the difference between pyenv, virtualenv, anaconda?

實踐建議:

建議團隊內開發人員,在自己電腦上都安裝 pyenv 和 pipenv 。Pipfile 和 Pipfile.lock 加入版本跟蹤,.venv 不要加入版本管理。為自己的每一個專案建立獨立的虛擬環境。

參考

  1. What is the difference between pyenv, virtualenv, anaconda?
  2. 利用pipenv和pyenv管理多個相互獨立的Python虛擬開發環境
  3. pipenv快速入門

相關文章