四個(gè)工具幫你輕松將python項(xiàng)目發(fā)布到生產(chǎn)環(huán)境
構(gòu)建良好的軟件遵循特定規(guī)則并強(qiáng)制執(zhí)行行業(yè)標(biāo)準(zhǔn),同時(shí)需要考慮:依賴(lài)關(guān)系、代碼質(zhì)量、工作流程、憑據(jù)。但這些如何反映在現(xiàn)實(shí)代碼庫(kù)中呢?在這篇文章中,我將向您展示我在Python項(xiàng)目中設(shè)置的4個(gè)工具,以便簡(jiǎn)化開(kāi)發(fā)工作流程并強(qiáng)制執(zhí)行一些優(yōu)秀實(shí)踐。
1. Poetry
當(dāng)我開(kāi)始一個(gè)新項(xiàng)目時(shí),我通常使用Poetry來(lái)管理依賴(lài)關(guān)系并創(chuàng)建一個(gè)全新的虛擬環(huán)境。這在不同項(xiàng)目依賴(lài)于相同包的不同版本時(shí)非常有用。
Poetry是一個(gè)很好的工具,因?yàn)樗诮馕鲆蕾?lài)關(guān)系方面速度很快。它還通過(guò)用戶(hù)友好的CLI易于使用,并有助于快速打包和分發(fā)您的代碼。
以下是如何使用Poetry啟動(dòng)新項(xiàng)目的方法:
poetry init
一旦你按下yes,就會(huì)創(chuàng)建一個(gè)pyproject.toml文件,用于包含項(xiàng)目的 metadata。這個(gè)文件可以提交到Git,并與您的同事共享,以重現(xiàn)相同的環(huán)境。項(xiàng)目設(shè)置完成后,您可以使用add命令添加依賴(lài)項(xiàng)。示例:
poetry add pandas
您還可以分組依賴(lài)項(xiàng)。例如,您可以將black和isort添加為開(kāi)發(fā)依賴(lài)項(xiàng)到dev組。示例:
poetry add black --group dev
如果再次查看pyproject.toml文件,我們將注意到依賴(lài)項(xiàng)的兩個(gè)單獨(dú)部分:
為什么這有用呢?
分組使您能夠輕松管理不同環(huán)境的依賴(lài)關(guān)系。例如,如果您有開(kāi)發(fā)和測(cè)試依賴(lài)項(xiàng),您可能希望在生產(chǎn)設(shè)置中安裝項(xiàng)目庫(kù)時(shí)忽略它們。這是如何做到的:
poetry install --without dev,test
依賴(lài)項(xiàng)安裝在哪里?
Poetry為每個(gè)項(xiàng)目創(chuàng)建一個(gè)虛擬環(huán)境。它位于隱藏的.venv文件夾中。您可以使用poetry shell命令激活它,并訪(fǎng)問(wèn)其特定的二進(jìn)制文件(python、pip、black等)。更多功能可以查看官方文檔以了解更多信息。
2. Pre-commit hooks
如果您是Python開(kāi)發(fā)人員,您可能經(jīng)常會(huì)遇到這樣的情況:您的團(tuán)隊(duì)成員具有不同的編碼風(fēng)格,這使得代碼庫(kù)不一致。結(jié)果,這導(dǎo)致錯(cuò)誤,降低了生產(chǎn)力,并使協(xié)作困難。pre-commit hooks就可以解決這個(gè)問(wèn)題,它在每次提交之前自動(dòng)運(yùn)行的腳本,用于檢查您的代碼是否存在錯(cuò)誤。
在我的項(xiàng)目中,我通常會(huì)在我的預(yù)提交配置中添加這些腳本:
- black — 用于格式化代碼
- pydoctyle — 確保代碼文檔符合Google的標(biāo)準(zhǔn)
- pycln — 用于刪除未使用的導(dǎo)入
- trailing-whitespace — 用于刪除額外的空格
- unitest — 用于運(yùn)行單元測(cè)試和檢測(cè)破壞性更改
要配置這些首先需要安裝pre-commit包:
pip install pre-commit
或者
poetry add pre-commit
然后,您需要在名為.pre-commit-configuration.yaml的YAML文件中進(jìn)行定義。以下是我通常使用的一個(gè):
repos:
- repo: https://github.com/psf/black
rev: '23.1.0'
hooks:
- id: black
args: [--config=pyproject.toml]
- repo: https://github.com/pycqa/pydocstyle
rev: '6.3.0'
hooks:
- id: pydocstyle
args: ['.']
- repo: https://github.com/hadialqattan/pycln
rev: 'v2.1.5'
hooks:
- id: pycln
args: ['.']
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: 'v4.4.0'
hooks:
- id: trailing-whitespace
- repo: local
hooks:
- id: unittest
name: run unit tests
language: system
pass_filenames: false
entry: poetry run coverage run -m pytest
現(xiàn)在你可以使用 install 命令進(jìn)行安裝:
pre-commit install
另外,如果您嘗試提交沒(méi)有文檔的代碼,您將收到此錯(cuò)誤,不會(huì)提交任何內(nèi)容到git。
這將迫使您修復(fù)代碼,然后再次提交。
3. Makefiles
Makefile將一系列shell命令分組在一個(gè)快捷方式(也稱(chēng)為目標(biāo))下。想象一下,每次更新代碼時(shí)都必須運(yùn)行以下單元測(cè)試命令:
poetry run coverage run -m pytest
poetry run coverage report
poetry run coverage html
那不是很繁瑣嗎?使用Makefile,您可以將這三個(gè)命令分組在一個(gè) test 目標(biāo)下?,F(xiàn)在,您只需運(yùn)行make test,而不是輸入這三行,這避免了不必要的代碼輸入或記住復(fù)雜的指令。
Makefile還有助于簡(jiǎn)化其他任務(wù),如:
- 安裝依賴(lài)項(xiàng)
- 設(shè)置環(huán)境變量
- 運(yùn)行腳本
- 構(gòu)建和推送Docker鏡像
- 構(gòu)建文檔
- 為代碼添加樣式
以下是我在我的一個(gè)開(kāi)源項(xiàng)目中使用的Makefile示例:
DOCKER_IMAGE := ahmedbesbes/cowriter
VERSION := $(shell git describe --always --dirty --long)
ifneq (,$(wildcard ./.env))
include .env
export
endif
run-cowriter:
@poetry run python -m src.main
run-cowriter-job:
@poetry run python -m src.job
run-web-agent:
@rm -rf db/ && poetry run python -m src.actions.web_searcher
build-image:
@docker build . -t $(DOCKER_IMAGE):$(VERSION)
push-docker-image-to-artifact-registry:
@gcloud builds submit --tag gcr.io/$(PROJECT_ID)/run_cowriter_job
lint:
@poetry run black .
test:
@poetry run coverage run -m pytest
@poetry run coverage report
@poetry run coverage html
Makefiles通常易于閱讀和理解,清晰地顯示了項(xiàng)目的不同部分是如何組織的,以及它們?nèi)绾蜗嗷ヒ蕾?lài)。這對(duì)于新團(tuán)隊(duì)成員入職或一段時(shí)間后重訪(fǎng)自己的項(xiàng)目尤其有幫助。
4. python-dotenv
作為開(kāi)發(fā)人員,我使用Python構(gòu)建依賴(lài)于憑據(jù)和敏感設(shè)置的應(yīng)用程序。以下是這些憑據(jù)的一些示例:
- 用于訪(fǎng)問(wèn)第三方服務(wù)的API密鑰
- 密碼和憑據(jù)
- 標(biāo)志
- 域名或URL
?? 這些憑據(jù)不應(yīng)該硬編碼或版本化在您的腳本中。一種安全的良好實(shí)踐是將它們加載為環(huán)境變量。
import os
api_key = os.environ.get("API_KEY")
為了避免每次都使用shell命令導(dǎo)出環(huán)境變量,您可以使用Python dotenv包:
- pip install python-dotenv
- 創(chuàng)建一個(gè)包含鍵值對(duì)憑據(jù)的.env文件
- 將.env添加到.gitignore,以防止Git提交它
- 使用python-dotenv模塊將設(shè)置加載到您的Python文件中
結(jié)論
我希望您發(fā)現(xiàn)這些工具有助于更好地構(gòu)建Python項(xiàng)目的結(jié)構(gòu),并自動(dòng)化繁瑣和重復(fù)的任務(wù)。