日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
一日一技:為Python項(xiàng)目編寫(xiě)Makefile

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

創(chuàng)新互聯(lián)公司是一家專業(yè)從事成都做網(wǎng)站、網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司。作為專業(yè)網(wǎng)站制作公司,創(chuàng)新互聯(lián)公司依托的技術(shù)實(shí)力、以及多年的網(wǎng)站運(yùn)營(yíng)經(jīng)驗(yàn),為您提供專業(yè)的成都網(wǎng)站建設(shè)、全網(wǎng)營(yíng)銷推廣及網(wǎng)站設(shè)計(jì)開(kāi)發(fā)服務(wù)!

作為 Makefiles的粉絲,我?guī)缀踉诿恳粋€(gè)業(yè)余項(xiàng)目里面都使用它們。并且我也主張?jiān)诠ぷ黜?xiàng)目中使用。

對(duì)開(kāi)源項(xiàng)目來(lái)說(shuō),Makefiles 讓代碼貢獻(xiàn)者知道怎么構(gòu)建、測(cè)試、部署項(xiàng)目。并且,如果你正確使用了 Makefiles,他們可以大大簡(jiǎn)化你的CI/CD 流程腳本。因?yàn)槟阒恍枰?jiǎn)單地調(diào)用對(duì)應(yīng)的 make 命令就可以了。最重要的是,Makefiles 可以簡(jiǎn)化你的開(kāi)發(fā)工作。

對(duì) Python 項(xiàng)目來(lái)說(shuō),我總是使用虛擬環(huán)境,因此我使用了兩個(gè)不同的 Makefiles 策略:

  • 假設(shè) make 命令是在虛擬環(huán)境里面執(zhí)行的
  • 通過(guò) make 命令來(lái)封裝虛擬環(huán)境的命令

假設(shè) make 命令是在虛擬環(huán)境中執(zhí)行的

我們來(lái)看一個(gè)非常簡(jiǎn)單的 Makefile 文件,這個(gè)文件可以讓你實(shí)現(xiàn)構(gòu)建、測(cè)試和發(fā)布 Python 項(xiàng)目:

 
 
 
 
  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 

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

假設(shè)已經(jīng)有一個(gè)虛擬環(huán)境了,那么你需要首先激活它,然后再運(yùn)行 make 命令:

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

當(dāng)然,不方便的地方在于,你的每一個(gè) shell 窗口都必須手動(dòng)激活虛擬環(huán)境。所以當(dāng)你使用 tmux 激活一個(gè)新的終端窗口或者把 vim 放到后臺(tái)上去運(yùn)行的時(shí)候,就很麻煩。

在 make 命令里面激活虛擬環(huán)境看起來(lái)是很難做到的,因?yàn)槊恳欢未a甚至每一個(gè)命令都會(huì)在它自己的 shell 里面運(yùn)行。但是我們稍后看一個(gè)辦法繞過(guò)這個(gè)限制,比如說(shuō)使用.ONESHELL標(biāo)志,但這無(wú)法解決新開(kāi)新的代碼片段運(yùn)行在新 shell 的問(wèn)題。

在 make 命令里面封裝虛擬環(huán)境的調(diào)用命令

第二個(gè)方法基本上解決了在 make 命令里面激活虛擬環(huán)境的問(wèn)題。這個(gè)辦法是從makefile.venv[2]里面學(xué)到的,我簡(jiǎn)化了一下:

 
 
 
 
  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 

僅從功能上看,這個(gè) Makefile 跟剛才的差不多,但是代碼看起來(lái)更復(fù)雜了。所以我們現(xiàn)在一行一行來(lái)看看它是怎么實(shí)現(xiàn)的。

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

這種方案有效,是因?yàn)楫?dāng)我們執(zhí)行. venv/bin/activate的時(shí)候,本來(lái)虛擬環(huán)境就是把它自己的絕對(duì)路徑放到了環(huán)境變量里面。因此每一次調(diào)用 Python 或者其他包的時(shí)候,都是使用虛擬環(huán)境中安裝的。

雖然 Makefile 文件變得有點(diǎn)復(fù)雜了,但是我們要測(cè)試代碼的時(shí)候,還是僅僅需要簡(jiǎn)單地執(zhí)行一下命令:

 
 
 
 
  1. $ make test 

就可以了,我們不需要再去關(guān)心虛擬環(huán)境是不是已經(jīng)安裝了之類的問(wèn)題。如果你不需要支持 Windows,甚至可以從 Makefile 里面移除Windows 相關(guān)的部分。這樣一來(lái),這個(gè) Makefile 文件即使對(duì)于不怎么用的人來(lái)說(shuō)也不難理解。

哪一種更好?

我覺(jué)得第二種方案更方便。雖然第一種方法我已經(jīng)快樂(lè)地用了幾年了,而第二種方法是最近才學(xué)到的。之前我確實(shí)沒(méi)有注意到這種方法。但我注意到幾乎所有使用 Makefile的 Python 項(xiàng)目都用的第一種方法,我也想知道為什么。

Kingname 點(diǎn)評(píng)

我在Python 項(xiàng)目和Golang 項(xiàng)目里面經(jīng)常使用Makefile,其中,Python 項(xiàng)目我主要用來(lái)刪除__pycache__,而 Golang 項(xiàng)目中,由于我使用的是 VSCode 來(lái)開(kāi)發(fā),它的 lint 有點(diǎn)問(wèn)題,所以代碼寫(xiě)完以后,我會(huì)使用 Makefile 來(lái)執(zhí)行一段gofmt命令,把所有.go文件都格式化。

但 Makefile 有一個(gè)非常智障的地方——它里面的縮進(jìn)必須使用制表符,不能使用空格。所以要寫(xiě)Makefile 的時(shí)候,我還必須用 vim 來(lái)寫(xiě)。因?yàn)槲业?PyCharm 已經(jīng)調(diào)成把所有制表符換成空格的設(shè)置了。而如果在 Makefile 的縮進(jìn)里面混入了空格,它就會(huì)報(bào)錯(cuò)。

如果大家對(duì) Makefile 有興趣的話,我給大家寫(xiě)一篇從入門(mén)到精通的文章。有興趣的同學(xué)請(qǐng)留言~

參考資料

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

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

本文轉(zhuǎn)載自微信公眾號(hào)「未聞Code」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系未聞Code公眾號(hào)。


當(dāng)前名稱:一日一技:為Python項(xiàng)目編寫(xiě)Makefile
網(wǎng)站URL:http://www.5511xx.com/article/djsggsp.html