返回文章列表

Python 虛擬環境套件管理與Docker應用

本文探討 Python 虛擬環境的建立與管理,並介紹如何結合 pip 與 conda 進行套件管理,同時說明 Docker 在 Python 開發流程中的應用與優勢,包含 Dockerfile 的撰寫、Docker Compose 的使用以及 Git 版本控制的整合。

Web 開發 DevOps

Python 虛擬環境是開發過程中不可或缺的工具,它能有效隔離專案依賴,避免版本衝突。本文除了介紹如何使用 venv 建立和管理虛擬環境外,也說明瞭 pipconda 兩種套件管理器的使用方式,並比較了它們的差異和優勢。更進一步,文章也詳細說明瞭 Docker 在 Python 開發中的應用,從 Dockerfile 的撰寫、映像檔的建置到 Docker Compose 的多容器應用程式管理,以及如何結合 Conda 和 Docker 的最佳實踐,最後也涵蓋了 Git 版本控制系統在專案中的應用,讓讀者能全面掌握 Python 開發的完整流程。

虛擬環境的重要性

虛擬環境允許開發者為每個專案建立獨立的 Python 環境,避免不同專案之間的依賴衝突。這對於維護專案的一致性和可移植性至關重要。

為何使用虛擬環境?

主要原因是隔離專案依賴。不同的專案可能依賴不同版本的第三方函式庫,直接安裝在系統級別的 Python 環境中容易導致版本衝突。使用虛擬環境,可以為每個專案建立獨立的依賴空間,避免這些問題。

管理虛擬環境的最佳實踐

  • 為每個專案建立獨立的虛擬環境。
  • 使用清晰的命名規則來標識不同的虛擬環境。
  • 在虛擬環境中安裝專案所需的依賴,並定期更新。

Python 虛擬環境與套件管理

在 Python 開發中,虛擬環境(virtual environment)與套件管理器(package manager)是兩項不可或缺的工具。虛擬環境提供了隔離的開發空間,避免不同專案之間的依賴衝突;套件管理器則簡化了第三方函式庫的安裝、更新與管理。本章將探討 Python 虛擬環境的建立與管理,並介紹主流的套件管理器 pip 與 conda。

建立與管理 Python 虛擬環境

Python 3.x 內建的 venv 模組使得建立虛擬環境變得簡單直接。以下命令可在終端機或命令提示字元中執行:

# 建立新的虛擬環境
$ python3 -m venv my_project_env

此命令會建立一個名為 my_project_env 的新目錄,包含 Python 可執行檔、lib 目錄(存放 site-packages)以及 bin 目錄(存放指令碼)。接著,使用以下命令啟動虛擬環境:

# 在 macOS/Linux 上啟動虛擬環境
$ source my_project_env/bin/activate
# 在 Windows 上啟動虛擬環境
> my_project_env\Scripts\activate

啟動後,所有透過 pip 安裝的套件都將被限制在該環境內,與全域 Python 直譯器隔離,避免版本衝突。

虛擬環境的高階組態

預設情況下,venv 建立的虛擬環境不會包含系統的 site-packages。若需存取全域套件,可在建立時加入 --system-site-packages 引數:

# 建立可存取系統 site-packages 的虛擬環境
$ python3 -m venv my_project_env --system-site-packages

對於需要多版本 Python 開發的專案,虛擬環境顯得尤為重要。結合 pyenvpyenv-virtualenv 等工具,可輕鬆管理不同 Python 版本的虛擬環境。

虛擬環境的實際應用

虛擬環境不僅便於隔離測試,還能簡化佈署與協作流程。開發者可透過以下命令凍結當前環境的套件組態:

# 凍結當前環境的套件組態
$ pip freeze > requirements.txt

其他開發者或佈署伺服器可透過以下命令重建相同的開發環境:

# 根據 requirements.txt 重建環境
$ pip install -r requirements.txt

在 CI/CD 環境中,虛擬環境有助於實作套件版本的精細控制,確保測試矩陣的可重現性。

虛擬環境與容器化技術的結合

在 Docker 等容器化技術中,虛擬環境提供了額外的隔離層,將應用程式依賴與容器依賴分離。這種雙層隔離機制增強了容器的可擴充套件性,並減少了依賴漂移帶來的影響。

Python 套件管理器

Python 套件管理器在管理函式庫與依賴關係方面扮演關鍵角色,簡化了軟體開發流程。目前,pip 與 conda 是 Python 生態系統中最主要的兩款套件管理器。

pip:Python 的預設套件管理器

pip 是 Python 的預設套件管理器,自 Python 3.4 版本起隨 Python 安裝包附帶。它透過存取 Python Package Index (PyPI) 來安裝、更新與管理套件。

基本使用方法

首先,驗證 pip 是否已安裝:

# 檢查 pip 版本
$ python3 -m pip --version
# 若未安裝 pip,可執行以下命令安裝
$ python3 -m ensurepip --upgrade

安裝套件的基本命令如下:

# 使用 pip 安裝套件
$ pip install numpy

開發過程中,保持套件更新至關重要:

# 更新已安裝的套件
$ pip install --upgrade numpy

移除不再需要的套件可保持環境整潔:

# 解除安裝套件
$ pip uninstall numpy

高階使用技巧

pip 支援指定套件版本,以確保不同佈署環境間的一致性:

# 安裝特定版本的套件
$ pip install numpy==1.21.0

結合 requirements.txt 檔案,pip 可用於團隊協作與佈署環境組態:

# 從 requirements.txt 安裝套件
$ pip install -r requirements.txt

使用Conda進行Python環境管理

在Python開發領域中,雖然pip是處理Python套件的最佳工具,但conda作為一個跨平台的套件管理器,卻能夠同時管理Python套件和其他依賴項。conda最初是為Anaconda發行版開發的,在資料科學和機器學習領域中,對於包含非Python依賴項的環境,conda在套件版本控制方面表現出色。

安裝Conda

要使用conda,首先需要透過Anaconda或Miniconda進行安裝。Miniconda提供了一個輕量級的替代方案,相比於完整的Anaconda套件組合,Miniconda更為簡潔。

在Linux/Mac上安裝Miniconda

# 下載Miniconda安裝指令碼
$ wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
# 執行安裝指令碼
$ bash Miniconda3-latest-Linux-x86_64.sh

在Windows上安裝Miniconda

請從以下網址下載Windows安裝程式:https://repo.anaconda.com/miniconda/

安裝完成後,驗證並初始化conda

# 檢查conda版本
$ conda --version

使用Conda管理環境

conda能夠無縫地管理環境。建立一個隔離的環境:

# 建立一個新的conda環境
$ conda create --name my_env python=3.8
# 啟動環境
$ conda activate my_env
# 停用環境
$ conda deactivate

conda環境中安裝套件非常簡單:

# 在當前conda環境中安裝套件
$ conda install scipy

使用特定通道安裝套件

conda維護多個通道,如預設通道、conda-forge等,每個通道都有一套針對不同計算架構最佳化的套件。

# 從特定通道安裝套件
$ conda install -c conda-forge pandas

在複雜的環境中,結合使用condapip可以充分發揮兩者的優勢。conda處理大型函式庫和非Python依賴項,而pip則管理conda通道中不可用的Python函式庫。在使用pip之前,先啟動conda環境,以確保兩個管理器之間的協調:

# 在conda環境中使用pip
$ conda activate my_env
$ pip install some-python-package

結合Pip與Conda的優勢

結合使用pipconda可以建立強壯、有效的環境,以適應不同的專案需求,為可擴充套件的解決方案奠定基礎。pipconda代表了Python開發基礎架構中的重要支柱,每個工具都在不同的使用場景中發揮著獨特的作用。

使用Docker進行Python開發

Docker徹底改變了軟體開發的方式,提供了一個與生產環境一致的隔離開發環境,從而減少了“在我的機器上可以執行”的問題,使開發者能夠更可靠、更自信地交付程式碼。對於Python開發者來說,Docker將應用程式及其依賴項封裝在輕量級的容器中,最佳化了開發、測試和佈署在不同基礎設施上的流程。本文提供了使用Docker進行Python開發的全面,闡述了Docker架構、容器管理、最佳實踐以及與開發工作流程的整合。

Docker的基本組成

Docker的核心由三個主要元件組成:Docker Engine、Docker Images和Docker Containers。Docker Engine是執行應用程式在容器中的執行環境。Docker Images是用於建立Docker Containers的範本或藍圖——虛擬化的執行環境。

安裝Docker

根據作業系統的不同,安裝Docker的命令也不同。在Linux系統(如Ubuntu)上,可以透過以下步驟安裝Docker:

# 更新現有的套件索引
$ sudo apt update
# 安裝必要的套件
$ sudo apt install apt-transport-https ca-certificates curl software-properties-common
# 新增Docker官方GPG金鑰
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# 設定穩定的倉函式庫
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
# 更新套件索引並安裝Docker
$ sudo apt update
$ sudo apt install docker-ce

對於macOS和Windows,Docker提供了Docker Desktop,可以從Docker官網下載並安裝。

驗證安裝:

# 驗證Docker安裝
$ docker --version

使用Docker Images

Docker Images作為容器不可變的範本。Python開發者通常從Docker Hub取得官方的Python Docker Images開始。這些Images預先組態了Python執行環境,適合構建Python應用程式。使用以下命令提取Python Image:

# 提取官方的Python Image
$ docker pull python:3.10-slim

此處的python:3.10-slim是一個輕量級的版本,在保持Python應用程式開發所需的基本功能的同時,減少了Image的大小。

編寫Dockerfile

要建立您的Docker化應用程式,首先需要編寫一個Dockerfile,它定義了環境設定,並包含了安裝依賴項所需的命令:

# 示例Python應用程式的Dockerfile
# 使用官方Python執行時作為父Image
FROM python:3.10-slim
# 設定工作目錄
WORKDIR /app
# 將當前目錄內容複製到容器中的/app目錄下
COPY . /app
# 安裝requirements.txt中指定的任何需要的套件
RUN pip install --no-cache-dir -r requirements.txt
# 將容器的80埠暴露給外部世界
EXPOSE 80
# 當容器啟動時執行app.py
CMD ["python", "app.py"]

詳細解說Dockerfile每個指令的作用與邏輯

  1. FROM python:3.10-slim:此指令指定了基礎Image,這裡使用的是官方的Python 3.10 slim版本。選擇slim版本是為了減小Image的大小,加快構建和佈署的速度。

  2. WORKDIR /app:設定容器內的工作目錄為/app。這意味著後續的指令(如COPY、RUN、CMD)將在/app目錄下執行。

  3. COPY . /app:將主機當前目錄下的所有檔案複製到容器的/app目錄下。這一步驟將應用程式的程式碼複製到容器中。

  4. RUN pip install –no-cache-dir -r requirements.txt:執行命令安裝requirements.txt檔案中列出的所有Python依賴項。 --no-cache-dir選項用於停用快取,以減少Image層的大小。

  5. EXPOSE 80:宣告容器將使用的埠。這裡表示容器將監聽80埠,但這並不會自動將主機的埠對映到容器埠,需要在使用docker run命令時透過-p引數來指定。

  6. CMD [“python”, “app.py”]:指定容器啟動時要執行的預設命令。這裡是執行Python應用程式的主指令碼app.py

結合Conda與Docker的最佳實踐

在某些專案中,可能需要結合使用Conda和Docker來充分利用兩者的優勢。可以在Docker容器中使用Conda來管理Python環境和依賴項。這種方法結合了Conda在管理複雜依賴項方面的強大功能和Docker在提供隔離、一致的開發和佈署環境方面的優勢。

示例:在Docker中使用Conda

首先,建立一個根據Miniconda的Docker Image:

FROM continuumio/miniconda3

# 設定工作目錄並複製環境檔案到容器中
WORKDIR /app
COPY environment.yml .

# 使用Conda建立環境並安裝依賴項
RUN conda env create -f environment.yml

# 啟動Conda環境並執行應用程式
CMD ["conda", "run", "-n", "my_env", "python", "app.py"]

其中,environment.yml是定義Conda環境和依賴項的檔案。

Docker 在 Python 開發中的應用與優勢

Docker 技術在現代軟體開發中扮演著至關重要的角色,特別是在 Python 專案的開發、測試和佈署流程中。Docker 提供了一個標準化且隔離的環境,能夠確保應用程式在不同計算環境中的一致性與可移植性。

Dockerfile 與 Docker 映像檔建置

Dockerfile 是定義 Docker 映像檔建置流程的指令碼,以下是一個典型的 Python 專案 Dockerfile 範例:

# 使用官方 Python 3.10-slim 映像檔作為基礎
FROM python:3.10-slim

# 設定工作目錄為 /app
WORKDIR /app

# 複製本地專案目錄內容到容器中
COPY . /app

# 安裝 requirements.txt 中指定的依賴套件
RUN pip install -r requirements.txt

# 設定預設執行指令為 app.py
CMD ["python", "app.py"]

內容解密:

  1. FROM python:3.10-slim:使用官方精簡版 Python 3.10 映像檔作為基礎,減少映像檔大小並提升建置效率。
  2. WORKDIR /app:在容器中設定 /app 為工作目錄,所有後續指令都在此目錄下執行。
  3. COPY . /app:將當前目錄(即本地專案目錄)中的所有檔案複製到容器的 /app 目錄。
  4. RUN pip install -r requirements.txt:安裝專案所需的 Python 套件。
  5. CMD ["python", "app.py"]:定義容器啟動時預設執行的指令。

建置 Docker 映像檔的指令如下:

# 建置名為 my-python-app 的 Docker 映像檔
$ docker build -t my-python-app .

執行應用程式的指令如下:

# 執行 Docker 容器並將容器的 80 連線埠對應到主機的 4000 連線埠
$ docker run -p 4000:80 my-python-app

此指令允許外部透過主機的 4000 連線埠存取容器內的應用程式。

Docker Compose 與多容器應用程式管理

對於複雜的應用程式,通常需要多個服務(如資料函式庫、快取和 API)協同工作。Docker Compose 是管理多容器應用的工具,其設定檔採用 YAML 格式,能簡化服務的管理。

以下是一個範例 docker-compose.yml 檔案:

version: '3'
services:
  web:
    build: .
    ports:
      - "4000:80"
  db:
    image: postgres
    environment:
      POSTGRES_PASSWORD: example

內容解密:

  1. version: '3':指定 Docker Compose 的版本。
  2. services:定義兩個服務:webdb
  3. web 服務:從當前目錄的 Dockerfile 建置映像檔,並將主機的 4000 連線埠對應到容器的 80 連線埠。
  4. db 服務:使用官方 PostgreSQL 映像檔,並設定環境變數 POSTGRES_PASSWORD

啟動所有服務的指令如下:

# 根據 docker-compose.yml 設定檔啟動所有服務
$ docker-compose up

Git 版本控制系統在 Python 專案中的應用

Git 是目前最流行的分散式版本控制系統,廣泛用於軟體開發專案中。它提供了強大的版本管理和協作功能,能有效追蹤變更、支援平行開發,並促進團隊協作。

初始化 Git 儲存函式庫

在 Python 專案中使用 Git,首先需要在專案目錄中初始化一個 Git 儲存函式庫:

# 初始化新的 Git 儲存函式庫
$ git init

初始化後,會在專案目錄下建立一個隱藏的 .git 資料夾,用於儲存版本控制的中繼資料。

提交變更與版本控制

接下來,將檔案新增至暫存區並提交變更:

# 將所有檔案新增至暫存區
$ git add .

# 提交變更並附上提交訊息
$ git commit -m "Initial commit"

清晰的提交訊息有助於記錄變更內容,方便後續追蹤與團隊協作。

分支管理與合併

Git 的分支功能允許開發者平行工作於不同的功能或修復任務,而不會影響主分支的穩定性。建立新分支的指令如下:

# 建立並切換到名為 feature_branch 的新分支
$ git checkout -b feature_branch

當功能開發完成後,可以將其合併回主分支:

# 切換回 main 分支
$ git checkout main

# 將 feature_branch 合併到 main 分支
$ git merge feature_branch

或者使用變基(rebase)操作來保持歷史記錄的線性:

# 將 feature_branch 變基到 main 分支上
$ git checkout feature_branch
$ git rebase main

與遠端儲存函式庫協作

在團隊開發中,通常會使用 GitHub、GitLab 或 Bitbucket 等平台託管遠端儲存函式庫。從遠端儲存函式庫克隆專案的指令如下:

# 從 GitHub 克隆儲存函式庫到本地
$ git clone https://github.com/username/repository_name.git

在參與開源專案或分享儲存函式庫時,通常會採用「Fork + Pull Request」的工作流程,以確保程式碼品質和安全性。