天天看點

base環境解除安裝python_Python 項目環境與依賴管理工具 Pipenv 入門在開發中使用 pipenv建立虛拟環境激活虛拟環境依賴包管理配置 PyPI 鏡像源配合 pyenv 使用在部署時使用 pipenv在 Docker 中使用 pipenvpipenv 的缺點lock 耗時跨平台問題

Tom CzHen 奇妙的Linux世界

base環境解除安裝python_Python 項目環境與依賴管理工具 Pipenv 入門在開發中使用 pipenv建立虛拟環境激活虛拟環境依賴包管理配置 PyPI 鏡像源配合 pyenv 使用在部署時使用 pipenv在 Docker 中使用 pipenvpipenv 的缺點lock 耗時跨平台問題

Python 開發中一般會使用 Virtualenv、Pip 管理項目運作環境與依賴。在建立一個新項目時先使用 Virtualenv 建立一個虛拟運作環境,然後使用 Pip 安裝依賴,最後使用 pip freeze > requirements.txt 記錄項目依賴。這個過程中會遇到一些問題:

  • 版本資訊沒有儲存
  • 更新依賴包時需要先檢視requirements.txt
  • 開發環境與生産環境依賴區分

解決上述問題最直接的做法就是生成多個 requirements.txt ,比如:requirements-dev.txt、requirements-prod.txt 并記錄好依賴版本資訊,或者選擇 Pipenv: Python Dev Workflow for Humans 。

從名字可以很直覺的看出 pipenv = pip + virtualenv。

在開發中使用 pipenv

在項目開發過程中使用 pipenv 體驗基本與 pip 一緻,而且由于 pipenv 也會同時管理虛拟環境,體驗上流程更順滑。pipenv 使用 Pipfile 與 Pipfile.lock 來管理依賴,Pipfile.lock 會根據安裝的依賴包記錄 hash 校驗值與版本資訊。

建立虛拟環境

在建立項目目錄下可以通過以下三種方式建立虛拟環境:

$ pipenv --python 3.6$ pipenv --python /path/to/python$ pipenv install requests --python 3.6
           
注意:如果沒有使用 --python 參數指定 Python 版本則會使用預設的 Python 版本建立,如果想指定預設 Python 版本可以通過環境變量 PIPENV_DEFAULT_PYTHON_VERSION 配置,可以設定為 Python 版本号:3.6.8 或 Python 解釋器程式路徑。

如果需要虛拟運作環境目錄指定在項目目錄下建立,有兩種方式可以實作:

  • 執行 pipenv 前先建立 .venv 目錄
$ mkdir .venv && pipenv install requests --python 3.6
           
  • 配置 PIPENV_VENV_IN_PROJECT 環境變量
$ export PIPENV_VENV_IN_PROJECT=1
           

如果想自定義這個目錄則需要通過 WORKON_HOME 環境變量來配置。

  1. 從現有項目建立虛拟環境

對于現有項目,可以區分為三種情況:

  • 沒有使用 pipenv

使用 pipenv install -r path/to/requirements.txt --python 3.6 來安裝依賴。

  • 有使用意向,但需要相容舊方式

通過 pipenv lock -r > requirements.txt 生成與 pip 相同格式的依賴管理檔案。

  • 已經在使用

根據需要可以使用 pipenv install 或 pipenv sync。兩者都會根據 Pipfile 中的 Python 版本建立虛拟環境,使用指定的 PyPI 源,差別是 pipenv install 會根據 Pipfile 中的版本資訊安裝依賴包,并重新生成 Pipfile.lock;而 pipenv sync 會根據 Pipfile.lock 中的版本資訊安裝依賴包。

也就是 pipenv install 安裝的依賴包版本可能被更新,具體的機制在依賴包管理中進一步說明。

激活虛拟環境

可以先激活虛拟環境,再來運作 Python :

$ pipenv shell
           

或者直接運作:

$ pipenv run python main.py
           

在項目根目錄下有 .env 環境配置檔案時,激活虛拟環境同時會加載 .env 檔案中的環境變量配置,如果不想使用這個功能可以通過配置 PIPENV_DONT_LOAD_ENV 變量來關閉它。

依賴包管理

pipenv 安裝包的使用方式與 pip基本一緻,直接在項目目錄下執行 pipenv install request 會安裝到虛拟環境目錄下,沒有虛拟環境則會建立後安裝。

  1. 安裝包

沒有指定版本資訊時,Pipfile 中不會注明版本,如果在新目錄中使用 pipenv install直接安裝依賴包的最新版本。

$ pipenv install requests
           

以下方式會指定為 1.2 或以上版本,但不會大于等于 2.0,使用 pipenv install 安裝依賴時,如果新版本在 1.2 到 2.0 之間(不包含 2.0 版本)就會更新

$ pipenv install “requests~=1.2”
           

更多的版本指定方式如下:

$ pipenv install "requests>=1.4"   # 版本号大于或等于 1.4.0$ pipenv install "requests<=2.13"  # 版本号小于或等于 2.13.0$ pipenv install "requests>2.19"   # 版本号大于 2.19.0
           

如果僅僅在開發 環境下使用這個包,可以添加 --dev 參數安裝:

$ pipenv install ipython --dev
           
  1. 更新包
  • 檢視有更新的包
$ pipenv update --outdated
           
  • 更新所有依賴包
$ pipenv update
           
  • 更新指定依賴包
$ pipenv update request
           

注意:更新依賴包的版本時受到 Pipfile 中版本資訊限制,如果想安裝超出限制的版本,則需要執行 pipenv install 安裝。

  1. 解除安裝包
$ pipenv uninstall requests
           

檢視依賴關系

$ pipenv graph
           

安裝或解除安裝依賴包之後,pipenv 都會更新 pipfile 與 pipfile.lock

配置 PyPI 鏡像源

通常會使用 pip.conf 或者 --index-url 參數來配置 PyPI 鏡像源,pipenv 中有多種配置方式:

  • 使用環境變量 PIPENV_PYPI_MIRROR 配置。
$ export PIPENV_PYPI_MIRROR=https://mirrors.aliyun.com/pypi/simple/
           
  • 使用項目中的 pipfile 檔案配置。

通過項目 pipfile 檔案中的 [[source]] 節也可以配置安裝源,并且隻對該項目生效。

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

配合 pyenv 使用

Linux 和 macOS 下可以安裝 pyenv 配合使用,在使用 pipenv 時如果指定的 Python版本沒有安裝,就會調用 pyenv 進行編譯安裝。

首先請參考 pyenv: Common build problems - Prerequisites 安裝好編譯依賴。

官方文檔連結:https://github.com/pyenv/pyenv/wiki/Common-build-problems#prerequisites

然後根據 Simple Python Version Management: pyenv - Installation 安裝好 pyenv。

官方文檔連結:https://github.com/pyenv/pyenv#installation

注意:Windows 使用者請手動下載下傳 Python 安裝包安裝,通過 pipenv --python X:Python...python.exe 指定 Python 版本,如果想編譯安裝請自行解決。
  1. 配置 pyenv

可以根據需要配置源碼緩存與編譯臨時檔案路徑,解決因為網絡問題無法下載下傳源碼包,或者 /tmp 分區空間不足造成編譯安裝失敗。

  • 源碼包緩存

添加緩存目錄,然後将源碼包存放到緩存目錄,并且編譯失敗時不會重新下載下傳源碼包。

$ mkdir -p $(pyenv root)/cache
           
  • 臨時檔案目錄

預設使用系統臨時檔案路徑 /tmp,指定其他路徑為臨時檔案目錄。

$ mkdir ~/tmp$ export TMPDIR="$HOME/tmp"
           
  • 有些第三方包工具比如 PyInstaller 需要 CPython 以 --enable-shared 參數編譯
$ env PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install 3.6.8
           

在部署時使用 pipenv

為了保證部署時安裝的依賴版本與釋出一緻,使用 pipenv install 需要加上 --deploy參數。

$ pipenv install --deploy
           

如果不使用虛拟環境,還需要加上 --system 參數

$ sudo pipenv install --deploy --system
           

在 Docker 中使用 pipenv

這裡給一個 Dockerfile 作為參考。

FROM python:3.6.8ENV PIP_INDEX_URL https://mirrors.aliyun.com/pypi/simple/RUN pip3 install pipenv --no-cache-dirRUN set -ex && mkdir /appWORKDIR /appCOPY Pipfile PipfileCOPY Pipfile.lock Pipfile.lockRUN set -ex && pipenv install --deploy --systemCOPY . /appEXPOSE 8888CMD ["python3", "main.py"]
           

也可以先建構一個 Base Image ,然後在建構應用鏡像時使用,假設建構的 Base Image tag 為 tomczhen/python-pipenv-base:3.6.8。

  • Base Image Dockerfile
FROM python:3.6.8ENV PIP_INDEX_URL https://mirrors.aliyun.com/pypi/simple/RUN pip3 install pipenv --no-cache-dirRUN set -ex && mkdir /appWORKDIR /appONBUILD COPY ["Pipfile","Pipfile.lock","./"]ONBUILD RUN set -ex && pipenv install --deploy --system
           
  • Python Application Image Dockerfile
FROM tomczhen/python-pipenv-base:3.6.8COPY . /appEXPOSE 8888CMD ["python3", "main.py"]
           

pipenv 的缺點

當然,pipenv 也有缺點存在。

lock 耗時

Lock updating is very slow · Issue #1914 · pypa/pipenv

這是一個代價問題。

由于需要根據依賴關系以及檔案 hash 來生成 Pipfile.lock,是以短時間内看這個問題應該是無法解決的。需要在 pipenv 帶來的依賴管理功能與速度上做一個權衡取舍。

目前的辦法是在安裝依賴時使用 pipenv install --skip-lock 來跳過生成/更新 Pipfile.lock,然後在需要時執行 pipenv lock 來生成/更新 Pipfile.lock。

跨平台問題

嚴格來說這并不算是 pipenv 的問題。

部分包在跨平台時的依賴不同,比如 PyInstaller 可以在多個平台使用,但僅在 Windows 上才依賴 pywin32 包,由于 Pipfile.lock 是根據安裝的包生成的,在之前的 pipenv版本中會造成跨平台時安裝依賴失敗(目前新版本中沒有問題)。

根據 Problem with Pipfile and system specific packages · Issue #1575 · pypa/pipenv 中的讨論看,即便 pywin32 修複了問題也隻能在新版本中解決,是以如果有跨平台需求還需要先确定是否正常。