成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一日一技:為 Python 項目編寫 Makefile

開發 后端
對開源項目來說,Makefiles 讓代碼貢獻者知道怎么構建、測試、部署項目。并且,如果你正確使用了 Makefiles,他們可以大大簡化你的CI/CD 流程腳本。因為你只需要簡單地調用對應的 make 命令就可以了。最重要的是,Makefiles 可以簡化你的開發工作。

[[392659]]

本文翻譯自Writing Makefiles for Python Projects[1]。原作者:Bastian Venthur.

作為 Makefiles的粉絲,我幾乎在每一個業余項目里面都使用它們。并且我也主張在工作項目中使用。

對開源項目來說,Makefiles 讓代碼貢獻者知道怎么構建、測試、部署項目。并且,如果你正確使用了 Makefiles,他們可以大大簡化你的CI/CD 流程腳本。因為你只需要簡單地調用對應的 make 命令就可以了。最重要的是,Makefiles 可以簡化你的開發工作。

對 Python 項目來說,我總是使用虛擬環境,因此我使用了兩個不同的 Makefiles 策略:

  • 假設 make 命令是在虛擬環境里面執行的
  • 通過 make 命令來封裝虛擬環境的命令

假設 make 命令是在虛擬環境中執行的

我們來看一個非常簡單的 Makefile 文件,這個文件可以讓你實現構建、測試和發布 Python 項目:

  1. all: lint test 
  2.  
  3. .PHONY: test 
  4. test: 
  5.     pytest 
  6.  
  7. .PHONY: lint 
  8. lint: 
  9.     flake8 
  10.  
  11. .PHONY: release 
  12. release: 
  13.     python3 setup.py sdist bdist_wheel upload 
  14.  
  15. clean: 
  16.     find . -type f -name *.pyc -delete 
  17.     find . -type d -name __pycache__ -delete 

這幾段代碼寫的非常直接,所有潛在貢獻者立刻就知道你項目的入口在哪里了。

假設已經有一個虛擬環境了,那么你需要首先激活它,然后再運行 make 命令:

  1. $ . venv/bin/activate 
  2. $ make test 

當然,不方便的地方在于,你的每一個 shell 窗口都必須手動激活虛擬環境。所以當你使用 tmux 激活一個新的終端窗口或者把 vim 放到后臺上去運行的時候,就很麻煩。

在 make 命令里面激活虛擬環境看起來是很難做到的,因為每一段代碼甚至每一個命令都會在它自己的 shell 里面運行。但是我們稍后看一個辦法繞過這個限制,比如說使用.ONESHELL標志,但這無法解決新開新的代碼片段運行在新 shell 的問題。

在 make 命令里面封裝虛擬環境的調用命令

第二個方法基本上解決了在 make 命令里面激活虛擬環境的問題。這個辦法是從makefile.venv[2]里面學到的,我簡化了一下:

  1. # system python interpreter. used only to create virtual environment 
  2. PY = python3 
  3. VENV = venv 
  4. BIN=$(VENV)/bin 
  5.  
  6. # make it work on windows too 
  7. ifeq ($(OS), Windows_NT) 
  8.     BIN=$(VENV)/Scripts 
  9.     PY=python 
  10. endif 
  11.  
  12.  
  13. all: lint test 
  14.  
  15. $(VENV): requirements.txt requirements-dev.txt setup.py 
  16.     $(PY) -m venv $(VENV) 
  17.     $(BIN)/pip install --upgrade -r requirements.txt 
  18.     $(BIN)/pip install --upgrade -r requirements-dev.txt 
  19.     $(BIN)/pip install -e . 
  20.     touch $(VENV) 
  21.  
  22. .PHONY: test 
  23. test: $(VENV) 
  24.     $(BIN)/pytest 
  25.  
  26. .PHONY: lint 
  27. lint: $(VENV) 
  28.     $(BIN)/flake8 
  29.  
  30. .PHONY: release 
  31. release: $(VENV) 
  32.     $(BIN)/python setup.py sdist bdist_wheel upload 
  33.  
  34. clean: 
  35.     rm -rf $(VENV) 
  36.     find . -type f -name *.pyc -delete 
  37.     find . -type d -name __pycache__ -delete 

僅從功能上看,這個 Makefile 跟剛才的差不多,但是代碼看起來更復雜了。所以我們現在一行一行來看看它是怎么實現的。

如果虛擬環境已經激活,或者pytest, flake8這些包已經安裝到了系統 Python 環境里面,那么我們直接調用他們就可以了。但是現在,在新的 Makefile 文件中,我們顯式地使用虛擬環境中的絕對路徑來調用他們。為了確保虛擬環境存在,每一段代碼都依賴于$(VENV)這一項。這一項確保了當前有一個最新的虛擬環境可用。

這種方案有效,是因為當我們執行. venv/bin/activate的時候,本來虛擬環境就是把它自己的絕對路徑放到了環境變量里面。因此每一次調用 Python 或者其他包的時候,都是使用虛擬環境中安裝的。

雖然 Makefile 文件變得有點復雜了,但是我們要測試代碼的時候,還是僅僅需要簡單地執行一下命令:

  1. $ make test 

就可以了,我們不需要再去關心虛擬環境是不是已經安裝了之類的問題。如果你不需要支持 Windows,甚至可以從 Makefile 里面移除Windows 相關的部分。這樣一來,這個 Makefile 文件即使對于不怎么用的人來說也不難理解。

哪一種更好?

我覺得第二種方案更方便。雖然第一種方法我已經快樂地用了幾年了,而第二種方法是最近才學到的。之前我確實沒有注意到這種方法。但我注意到幾乎所有使用 Makefile的 Python 項目都用的第一種方法,我也想知道為什么。

Kingname 點評

我在Python 項目和Golang 項目里面經常使用Makefile,其中,Python 項目我主要用來刪除__pycache__,而 Golang 項目中,由于我使用的是 VSCode 來開發,它的 lint 有點問題,所以代碼寫完以后,我會使用 Makefile 來執行一段gofmt命令,把所有.go文件都格式化。

但 Makefile 有一個非常智障的地方——它里面的縮進必須使用制表符,不能使用空格。所以要寫Makefile 的時候,我還必須用 vim 來寫。因為我的 PyCharm 已經調成把所有制表符換成空格的設置了。而如果在 Makefile 的縮進里面混入了空格,它就會報錯。

如果大家對 Makefile 有興趣的話,我給大家寫一篇從入門到精通的文章。有興趣的同學請留言~

參考資料

[1]Writing Makefiles for Python Projects: https://venthur.de/2021-03-31-python-makefiles.html

[2]makefile.venv: https://github.com/sio/Makefile.venv

本文轉載自微信公眾號「未聞Code」,可以通過以下二維碼關注。轉載本文請聯系未聞Code公眾號。

 

責任編輯:武曉燕 來源: 未聞Code
相關推薦

2021-04-19 23:29:44

MakefilemacOSLinux

2021-07-27 21:32:57

Python 延遲調用

2021-09-13 20:38:47

Python鏈式調用

2024-11-13 09:18:09

2021-04-05 14:47:55

Python多線程事件監控

2021-03-12 21:19:15

Python鏈式調用

2024-07-30 08:16:18

Python代碼工具

2024-07-30 08:11:16

2021-10-15 21:08:31

PandasExcel對象

2021-04-27 22:15:02

Selenium瀏覽器爬蟲

2025-05-28 03:15:00

Scrapy數據sleep

2024-02-20 22:13:48

Python項目Java

2020-05-19 13:55:38

Python加密密碼

2021-09-14 21:29:01

項目環境變量

2024-11-11 00:38:13

Mypy靜態類型

2021-10-03 20:08:29

HTTP2Scrapy

2024-05-24 09:07:06

JSONprint字符串

2021-05-08 19:33:51

移除字符零寬

2024-07-19 18:23:17

2022-06-28 09:31:44

LinuxmacOS系統
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久激情视频 | 91中文在线观看 | 日韩午夜激情 | 免费观看羞羞视频网站 | 91精品国产高清久久久久久久久 | 在线成人 | 亚洲视频免费一区 | 91一区二区三区在线观看 | 成人三级视频 | 欧美日韩精品一区二区三区视频 | 欧美日韩在线高清 | 亚洲视频免费一区 | 国产一区h | 九九亚洲| 在线一区视频 | 亚洲精品乱码久久久久久久久 | 日韩欧美久久 | 午夜激情一区 | 91在线影院 | 免费观看一级毛片视频 | 天天干夜夜操 | 天天草天天爱 | 欧美一级二级视频 | 欧美久久久久久 | 一区视频在线播放 | 日韩欧美第一页 | 久久高清免费视频 | 欧美精品乱码久久久久久按摩 | 91精品国产乱码久久久 | 精品国产一区二区三区久久久久久 | 夜夜骑首页 | 国产麻豆乱码精品一区二区三区 | www.激情.com| 久艹网站 | 国产精品美女一区二区三区 | 亚洲女人天堂成人av在线 | 欧美综合一区 | 日韩欧美在线不卡 | 人人人人干 | 97色伦网 | 日韩在线播放网址 |