Python虛擬環境

當我們開發多個應用程序時,可能各應用程序依賴不同版本的工具包。比如應用A需要requests2.21.0 ,而應用程序B需要requests2.23.0。那麼每個應用可能需要各自擁有一套“獨立”的Python運行環境,下面梳理venv, virtualenv, pipenv 三個工具的使用。

venv

venv為Python內置模塊,用於創建和管理虛擬環境的。

  1. 安裝最新版本的 Python,venv通常會自帶安裝完成。Python3.3增加了venv模塊, Python3.5對venv進行了改進,3.5+ 版本官方推薦使用venv作為管理虛擬環境的工具。如果系統上有多個版本的 Python,可以通過運行 python3 或您想要的任何版本來選擇特定的Python版本。python3 -m venv tutorial-env將創建 tutorial-env 目錄,並在其中創建包含Python解釋器,標準庫和各種支持文件的副本的目錄。虛擬環境的常用目錄位置是 .venv。 這個名稱通常會令該目錄在終端中保持隱藏。
  2. 激活虛擬環境在Unix或MacOS上,運行:source tutorial-env/bin/activate激活成功後將更改Shell提示符,以顯示正在使用的虛擬環境:(tutorial-env)Mac:python_basic Sunny$在Windows上,運行:tutorial-env\\Scripts\\activate.bat
  3. 退出虛擬環境

在Unix或MacOS上,運行:(tutorial-env) SunnyiMac:bin Sunny$ deactivate在Windows上,運行:tutorial-env\\Scripts\\deactivate.bat

virtualenv

  1. 安裝virtualenv
    pip3 install -U virtualenv
    以macosx為例$sudo pip3 install -U virtualenv 這裡使用sudo是為了確保virtualenv命令行命令能安裝成功,如果不用sudo可能由於權限問題而導致virtualenv模塊安裝成功,但無法通過命令行直接使用。

2.創建虛擬環境第一步,創建目錄:

<code>Mac:~ Sunny$ mkdir python_basic
Mac:~ Sunny$ cd python_basic/
Mac:python_basic Sunny$
/<code>

第二步,創建一個獨立的Python運行環境,命名為py_basic

<code>Mac:python_basic Sunny$ virtualenv --no-site-packages py_basic
/<code>

命令virtualenv就可以創建一個獨立的Python運行環境,加上了參數--no-site-packages,這樣,已經安裝到系統Python環境中的所有第三方包都不會複製過來,這樣,就得到了一個不帶任何第三方包的“乾淨”的Python運行環境。

3.激活虛擬環境

<code>Mac:python_basic Sunny$ source py_basic/bin/activate   # sh, bash, ksh, or zsh
(py_basic)Mac:python_basic Sunny$
注意命令提示符變化,有個(py_basic)前綴,表示當前環境是一個名為py_basic的Python環境
/<code>
<code>(py_basic)Mac:python_basic Sunny$pip install --upgrade pip # 更新虛擬環境的pip
(py_basic)Mac:python_basic Sunny$pip list # 查看虛擬環境內已安裝的工具包
/<code>

4.退出虛擬環境

<code>(py_basic)Mac:python_basic Sunnyl$ deactivate 
Mac:python_basic Sunny$
/<code>

通過virtualenv完全可以針對每個應用創建獨立的Python運行環境,這樣就可以對每個應用的Python環境進行隔離。

virtualenv是實現“獨立”的Python運行環境的原理:

  1. 把系統Python複製一份到virtualenv的環境。
  2. 用命令source venv/bin/activate進入一個virtualenv環境時,virtualenv會修改相關環境變量,讓命令python和pip均指向當前的virtualenv環境。

pipenv

pipenv 是Python官方推薦的包管理工具pipenv 目的旨在將包管理領域最有優秀的理念與功能引入到Python世界中來。pipenv將自動為項目創建和管理虛擬環境,並在安裝/卸載模塊包時從Pipfile中添加/刪除模塊包,生成Pipfile.lock來鎖定安裝包的版本和依賴信息,避免構建錯誤,確保穩定構建

pipenv主要解決如下幾方面問題:

  • 集成pip 和virtualenv 兩個工具功能,不再需要單獨去使用它們,可以通過pipenv讓它們一切協同工作。
  • 針對管理requirements.txt文件可能會出現問題,pipenv使用Pipfile和Pipfile.lock代替requirements.txt
  • 引入哈希機制,哈希無處不在,提升安全;並確保自動公開安全漏洞。
  • 引入模塊包依賴關係圖,依賴關係一眼可見
  • 通過加載.env文件簡化工作流程。

pipenv依賴virtualenv


Python虛擬環境

image.png

1. 安裝

為了方便使用, 建議全局安裝$ pip install pipenv

2. 使用

通過pipenv創建一個虛擬環境與項目(文件夾)綁定在項目目錄下執行:

  • pipenv install
    創建虛擬環境並與項目目錄綁定
<code>SunnyiMac:pip-env Sunny$ pipenv install
Creating a virtualenv for this project…
Pipfile: /Users/Sunny/SunnyLearn/IT/Python/python_venv/pip-env/Pipfile
Using /Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6 (3.6.8) to create virtualenv…
⠴ Creating virtual environment...created virtual environment CPython3.6.8.final.0-64 in 1010ms
creator CPython3Posix(dest=/Users/Sunny/.local/share/virtualenvs/pip-env-LlWfIOtH, clear=False, global=False)
seeder FromAppData(download=False, pip=latest, setuptools=latest, wheel=latest, via=copy, app_data_dir=/Users/Sunny/Library/Application Support/virtualenv/seed-app-data/v1)
activators BashActivator,CShellActivator,FishActivator,PowerShellActivator,PythonActivator,XonshActivator

✔ Successfully created virtual environment!
Virtualenv location: /Users/Sunny/.local/share/virtualenvs/pip-env-LlWfIOtH
Creating a Pipfile for this project…
Pipfile.lock not found, creating…
Locking [dev-packages] dependencies…
Locking [packages] dependencies…
Updated Pipfile.lock (ca72e7)!
Installing dependencies from Pipfile.lock (ca72e7)…
▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 0/0 — 00:00:00
To activate this project's virtualenv, run pipenv shell.
Alternatively, run a command inside the virtualenv with pipenv run.
SunnyiMac:pip-env Sunny$ ls
Pipfile Pipfile.lock
/<code>
  • pipenv shell
    激活虛擬環境,若沒有找到綁定虛擬環境將自動創建虛擬環境並激活該虛擬環境。
<code>SunnyiMac:pip-env Sunny$ pipenv shell
Launching subshell in virtual environment…
bash-3.2$ . /Users/Sunny/.local/share/virtualenvs/pip-env-LlWfIOtH/bin/activate
(pip-env) bash-3.2$
/<code>

退出pipenv環境$ exit

說明:個人理解pipenv在使用過程中,和virtaulenv不同:virtaulenv需要激活進入虛擬環境,pipenv使用過程中比如安裝包其實不需要激活虛擬環境,在當前目錄操作其實就是在操作本目錄下綁定的虛擬環境。

  • pipenv install somepackage在虛擬環境下安裝包,若沒有找到綁定虛擬環境將自動創建虛擬環境。$pipenv install flask既然已經隔離的為什麼不直接用pip 安裝 Flask ,而是用pipenv, 個人判斷兩個都是可以達到目的;原因猜測pipenv本就是希望一個命令通行天下)`同時修改Pipfile, Pipfile.lock
  • pipenv uninstall somepackage在虛擬環境下卸載包$ pipenv uninstall flask同時修改Pipfile, Pipfile.lock
  • pipenv graph查看安裝包的依賴關係$ pipenv graph
  • pipenv clean清理安裝包,刪除沒有在Pipfile.lock中指定的包$ pipenv clean
  • pipenv lock生成lockfile$ pipenv lock
  • pipenv --rm刪除一個虛擬環境$pipenv --rm

3.擴展

  • 添加shell補齊如果使用的是bash, 可添加下面語句到.bashrc或.bash_profileeval "$(pipenv --completion)" 個人推薦使用下面方式實現命令行補齊支持:$ pipenv --completion >> ~/.bash_profile
  • 為了安裝指定版本的包信息,可以使用:$ pipenv install requests==2.13.0
  • 指定安裝包的源如果我們需要在安裝包時,從一個源下載一個安裝包,然後從另一個源下載另一個安裝包,我們可以通過下面的方式配置[[source]] url = "https://pypi.python.org/simple" verify_ssl = true name = "pypi" [[source]] url = "https://mirrors.aliyun.com/pypi/simple/" verify_ssl = false name = "aliyun" [dev-packages] [packages] requests = {version="*", index="aliyun"} maya = {version="*", index="pypi"} records = "*"

設置了兩個源:

  • pypi(https://pypi.python.org/simple)
  • aliyun(https://mirrors.aliyun.com/pypi/simple/)

同時指定requests包從aliyun源下載,maya包從pypi源下載

需要特別說明:國內通過pypi源會出現Locking Failed!錯誤

<code>Installing flask…
Adding flask to Pipfile's [packages]…
✔ Installation Succeeded
Pipfile.lock (f20c47) out of date, updating to (ef1c0c)…
Locking [dev-packages] dependencies…
Locking [packages] dependencies…
✘ Locking Failed!
/<code>

切換為國內源,馬上解決,推薦使用阿里源修改目錄下的Pipfile文件

<code># [[source]] 

# name = "pypi"
# url = "https://pypi.org/simple"
# verify_ssl = true

[[source]]
name = "aliyun"
url = "https://mirrors.aliyun.com/pypi/simple/"
verify_ssl = true
/<code>

注意需要註釋掉原有source,不然無論將阿里源的配置放在前面還時候後面都會有問題,關於具體原因,通過pipenv -v install flask可以看出一些端倪,需要進一步深入研究來最終確認問題。//TODO

3. 卸載pipenv

$ pip uninstall pipenv


分享到:


相關文章: