天天看點

python利器——pipenv和pyenv介紹

文章目錄

    • 一、pyenv
    • 二、pipenv
    • 三、virtualenv
    • 四、線上部署
    • 參考資料

在寫python程式時,經常會被版本管理以及第三方包管理搞的很頭疼。這兩天看了業内相關的解決方案,覺的很不錯。

一、pyenv

我們經常在開發時會需要用到多個python版本,為了解決版本問題,比較常見的做法是修改環境變量來切換版本,但是修改環境變量終究比較麻煩。另外,我們在安裝新的python版本時也會小心翼翼,避免影響到系統自帶的python版本。這個問題都可以通過pyenv來解決。

pyenv可以在系統中安裝多個python版本,并且不影響到系統自帶的python,而且通過pyenv我們可以快速的在多個python版本之間來回切換。

安裝pyenv之前需要保證電腦上已經安裝了git:

git clone git://github.com/yyuu/pyenv.git ~/.pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.zshrc
exec $SHELL -l
           

安裝好了之後,使用很簡單,比如我們要安裝python3.7.3的版本,可以直接通過pyenv安裝

pyenv install 3.7.3
           
3.7版本需要一個新的包libffi-devel,如果安裝過程中報

ModuleNotFoundError: No module named '_ctypes'

,可以安裝一下這個包。 yum install libffi-devel -y

之後可以通過以下指令快速切換python指令

pyenv global 3.7.3
           

其實pyenv的原理也很簡單,就是對python版本進行統一管理,之後也是通過修改環境變量來切換python指令的指向。但是通過pyenv我們隻要執行一個指令就可以了,我們可以看到所有通過pyenv安裝的python版本都放在

~/.pyenv/versions

目錄下,也更加友善管理

pyenv which python
# ~/.pyenv/versions/3.7.3/bin/python
           

pyenv 支援的參數也比較少:

Some useful pyenv commands are:
   commands    List all available pyenv commands
   local       Set or show the local application-specific Python version
   global      Set or show the global Python version
   shell       Set or show the shell-specific Python version
   install     Install a Python version using python-build
   uninstall   Uninstall a specific Python version
   rehash      Rehash pyenv shims (run this after installing executables)
   version     Show the current Python version and its origin
   versions    List all Python versions available to pyenv
   which       Display the full path to an executable
   whence      List all Python versions that contain the given executable
           

shell表示切換的版本僅目前版本有效,session關閉後就失效了

global表示全局,重新開機也不會影響更改

local表示臨時生效,但是系統重新開機後就不會生效了

二、pipenv

pyenv雖然解決了python版本切換的問題,但是依舊無法解決各個項目的第三方包管理的問題。比如說A項目需要用requests版本是1.0,而B項目需要requests版本是2.0。這時候pipenv就派上用場了。值得一提的是,pipenv也是寫requests的那位大佬寫的。

pipenv可以為我們的項目自動建立和管理一個虛拟環境。并且會在項目目錄下建立一個Pipfile來管理第三方包。

pipenv的安裝很簡單:

# 可以用pyenv先安裝一下python3
pip3 install pipenv
           

使用也很簡單,進入項目目錄後,使用以下任一指令建立一個虛拟環境:

# 基于python3建立一個虛拟環境
pipenv --three
# 或者基于python2建立一個虛拟環境
pipenv --two
# 也可以指定版本建立
pipenv --python 3.6
           
注意,pipenv指定python版本時必須保證機器上已經安裝了那個版本的python了。這個可以用pyenv安裝

建立成功後會在項目目錄下生産一個Pipfile檔案來管理第三方包。之後可以通過以下指令安裝requests

pipenv install requests
           

這樣requests的安裝隻對目前項目生效。之後可以通過以下指令進行虛拟環境運作相關腳本:

pipenv shell
           

或者通過以下指令直接使用虛拟環境運作指令:

pipenv run python xxx.py
           

pipenv的原理也很簡單,我們輸入

pipenv -venv

就可以得到虛拟環境的目錄。然後在執行pipenv shell時,會看到以下輸出語句:

. ~/.local/share/virtualenvs/monitor-9E5KrdNU/bin/activate
           

其實就是激活虛拟環境的activate,設定一下相關環境變量。通過pipenv安裝的第三方包也都在

~/.local/share/virtualenvs/monitor-9E5KrdNU/lib

目錄下。

雖然pipenv還有很多強大的地方,但是對于就偶爾寫寫python代碼的我來說,上面的這些就足夠用了,是以這裡不多做介紹。感興趣的可以看參考資料裡面的幾篇部落格

三、virtualenv

有了pipenv後,其實virtualenv已經沒什麼用了。但是也有人線上上部署的時候結合virtualenv和pipenv來部署,是以這裡做個簡單的介紹。

安裝virtualenv也很簡單:

pip install virtualenv
           

之後建立一個虛拟環境:

# 通過-p可以指定要建立的虛拟環境的python執行檔案
virtualenv -p /usr/local/python venv
           

其實就是建立了一個venv的目錄,這個目錄下有bin、lib、include,其中通過虛拟環境安裝的第三方包都會放在lib下。

通過以下指令進入虛拟環境:

source bin/activate
           

和pipenv基本一樣,就是通過activate設定了環境變量。

之後通過

deactivate

退出虛拟環境,其實就是恢複了環境變量。

四、線上部署

使用pipenv在本地開發好後,總要部署到線上。如果線上也能直接安裝pipenv固然最好,但是不好在伺服器安裝pipenv的情況,怎麼辦呢?

1、如果線上使用的是virtualenv管理虛拟環境的話

可以直接在virtualenv的虛拟環境中安裝pipenv,這樣就可以直接運作我們基于pipenv建構的項目了

# 建立虛拟環境
python3 -m virtualenv .venv
# 用虛拟環境的pip安裝pipenv
.venv/bin/python -m pip install -U pip pipenv
# 通過虛拟環境的pipenv安裝第三方包
.venv/bin/pipenv install --dev --deploy
           

2、 如果線上連virtualenv都沒有的話

通過pipenv導出requirements.txt,然後到線上安裝第三方包

# 本地執行,然後導到線上
pipenv run pip freeze > requirements.txt

# 伺服器安裝第三方包
python -m pip -r requirements.txt
           

參考資料

pipenv介紹

pyenv介紹

virtualenv介紹