工程化你的Python項目

2021-02-21 寫程序的康德

現代軟體開發越來越複雜,如果還單純的認為學習軟體開發就是學習某某程式語言那估計最多只能寫寫「Hello World」之類的程序了。我不覺得這種「複雜」是一種無病呻吟的病態,相反我認為這是軟體開發技術的進步。系統越來越複雜,團隊協作也越來越突出,這就決定了我們的工具也越來越複雜。工程化可以幫助我們的項目更加規範,讓新成員更加容易理解項目。這篇文章裡我會結合國情來介紹一些Python工程化心得。

python-skeleton
├── README.md #
├── docs #文檔
├── etc #示例配置文件
├── python_skeleton #項目所有代碼
└── tests #測試代碼

上面是我的工程結構,下面我們就要針對這個工程來實現工程化

這樣的代碼結構就是import的災難,除了使用相對引用之外沒有別的辦法,所以這不是一種好的實踐。第一步我們先給工程增加一個setup.py


這麼多配置項沒人能記得住,所以一般情況下我們可以從別的工程中複製setup.py。long_description是一段很長的描述,所以我直接從README.md中讀取整個項目的描述packages描述了哪些Python的包被打包,find_packages會查找當前工程下所有的Python包,通過exclude剔除了不參與打包的。例子中就是單元測試、文檔和示例配置有了setup.py之後我們執行python setup.py develop,這條命令會在site-package中建立一個link,指向我們當前的工程,所以我們的代碼就可以使用絕對引用了。


python_skeleton是我項目所有原始碼所在的包

單元測試被所有軟體工程強調,所以作為工程化的一部分我們必須要給出單元測試的最佳實踐。我的單元測試代碼都在tests包,解決了import的問題後它是可以直接在IDE中執行了。但是一個一個的執行測試用例是非常麻煩的,所以我們希望通過python setup.py test來一次執行所有的單元測試這樣。


修改setup.py,添加一句。我比較懶,所以直接用python unittest 作為單元測試工具,如果你用nose作為單元測試工具需要寫兩句


test_require指定了測試的依賴,在執行python setup.py test的時候會首先下載依賴然後再執行測試。

python最大的特點就是提供了非常非常豐富的第三方包,例如:我的代碼中使用python-click。隨著項目的開發勢必還會增加更多第三方包,如果一個一個的安裝那就太原始了。所以通過工程化我希望可以讓新加入的小夥伴執行一句pip install -r requirements.txt就可以自動安裝所有依賴。


我們新建一個requirements.txt,裡面寫上我們需要的依賴,執行pip的時候直接通過文件安裝依賴。setup.py中也會有依賴,當我們執行python setup.py install的時候這些依賴會被安裝到當前系統中。所以我們希望setup.py中的依賴和requirements.txt的依賴保持一致。


這個功能非常酷,我希望給我的程序增加一個命令行。用戶輸入:python-skeleton就可以執行我的程序了。


setup.py新增加一條,python-skeleton是命令名稱,python_skelecton.cli是類,main是要執行的方法。


我使用python-click為項目增加了兩個參數分別指定配置文件和日誌配置文件。默認是使用/etc下面的

命令行工具自動生成了,我希望還可以把代碼中的兩個配置實例


複製到系統的/etc/python-skeleton中。這樣安裝的時候我們只需要執行python setup.py install就可以成功安裝命令行腳本、自動複製配置文件了,簡直是妙不可言。

總結一下,到目前為止我們有setup.py、requirements.txt兩個文件。通過這兩個配置我們可以

python setup.py develop來安裝開發環境,這樣代碼裡面就可以使用絕對應用

通過pip install -r requirements.txt來安裝依賴

發布的時候通過python setup.py install在目標系統上自動生成命令行腳本,複製配置文件,自動安裝依賴

到目前為止我們可以通過python setup.py sdist來生成壓縮文件


安裝的時候只需要解壓這個文件,然後執行python setup.py install


DUANG,我們收到一個錯誤。提示我們README.md文件找不到,如果我們查看發現壓縮文件裡面沒有README.md和requirements.txt文件。我們的setup.py腳本是通過讀取這兩個文本文件生成配置的,所以在打包的時候需要把這兩個文件也給打包進去。通過新增MANIFEST.in我們實現這個
再執行打包,我們的壓縮裡面就會有這兩個文件

通過上面的步驟我們生成的壓縮包只有我們的代碼,如果發布到生成環境時python setup.py install會幫我們自動下載依賴。遺憾的是——在我朝,通常生產伺服器都是沒有網絡的。所以我們希望可以通過離線的方式把第三方pip下載下來。通過執行pip download -r requirements.txt -d ./pipcache我們可以把依賴下載到pipcache文件夾中(請確保pipcache文件夾存在)在生產環境我們使用pip install --no-index --find-links=pipcache -r requirements.txt通過本地文件夾安裝依賴

好了,到這裡我們的自動化已經完成了。

1. python setup.py develop連結文件,解決import的問題
2. pip install -r requirements.txt 安裝依賴
3. pip download -r requirements.txt -d ./pipcache 下載離線依賴(可選)

1. pip install --no-index --find-links=pipcache -r requirements.txt離線安裝依賴(可選)
2. python setup.py install安裝系統,該命令會生成命令行腳本,複製配置文件

這些命令都太長了,我希望通過一個腳本自動化打包,清除臨時文件(刪除pyc,egg等臨時文件),同時為部署的時候生成一個腳本(畢竟那條離線安裝的命令太長了。。。。)所以我寫了一個Makefile

通過為腳本增加-i http://pypi.douban.com/simple --trusted-host pypi.douban.com選項可以加速PIP的下載。具體參考我的github。

最後貢獻出所有的代碼,我的github上

相關焦點

  • Vue+webpack工程化構建(純前端)
    不知道你有沒有發現,現在前端發展對jQ插件的依賴越來越少了。前幾天在知乎上看到一篇文章,是對web前端工程化的了解。1、web前端工程的理解首先,為什麼前端要工程化,他能解決我們什麼問題?隨著用戶體驗的不斷升級,對前端需求的不斷增加,如何進行高效的多人協作?如何保證項目的可維護性?如何提高開發質量?等等這些問題迫切需要我們進行前端工程化的構建。
  • Python Flask-RESTPlus 工程化實踐
    在繼續閱讀本指南之前,你應該對 Python 程式語言和 Flask 框架有基本的了解。如果你不熟悉這些內容,建議閱讀介紹性文章——如何使用 Python 和 Flask 構建 Web 應用程式。通過在終端上執行以下命令來創建新環境並激活它:mkproject name_of_your_project項目配置和結構這裡使用功能性結構通過文件的功能來組織項目文件。
  • 工程化(33): 什麼是 Long Term Cache
    「前端工程化」系列正在更新: 32/36使用 webpack 等打包器進行打包時,每個資源都可生成一個帶有 hash 的路徑。
  • 怎麼使用pipenv管理你的python項目
    這種方法一般都會正常工作,但有時它也會表現出一些怪異的行為,因此你必須手動安裝或刪除某些特定版本的包,並記得定期更新requirements.txt文件,以保持項目環境的一致。特別是當你想要在你的虛擬環境中安裝Python包,但它不一定與項目本身相關聯。
  • 工程化(10): JS 體積優化之 browserslist 優化打包體積
    「前端工程化」系列正在更新: 11/36browserslit 用特定的語句來查詢瀏覽器列表,如 last 2 Chrome versions
  • 工程化(19): 質量保障篇之如何確保項目是否有風險依賴
    「前端工程化」系列正在更新: 19/36如何確保所有 npm install 的依賴都是安全的?
  • 如何將你的Python項目全面自動化?
    每個項目——無論你是在從事 Web 應用程式、數據科學還是 AI 開發——都可以從配置良好的 CI/CD、Docker 鏡像或一些額外的代碼質量工具(如 CodeClimate 或 SonarCloud)中獲益。所有這些都是本文要討論的內容,我們將看看如何將它們添加到 Python 項目中!
  • 教你如何閱讀 Python 開源項目代碼
    ajdavis  mongo-python-driver「pymongo」、tornado 等項目的主要貢獻者。bitprophet  fabric、paramiko「Python 的 ssh 庫」作者。前 2 個是公認的 Python 領域代碼寫的最好的、最有創意的工程師。
  • 生物工程化,機器生物化
    最近幾年,網際網路充斥著人工智慧的話題,我不是計算機科學相關專業的人員,但是今天想聊一聊「生物工程化,機器生物化「的話題」。
  • python項目打包之Pyinstaller
    而本公眾號的作者當時也受到這股風潮的撩動,加入了python編程的大軍。幸運的是,現所在的課題組也更多的使用python進行編程和分析數據,因此也算所學的東西沒有浪費吧。然而,當最近希望發布之前用python寫的可視化項目Multi-omics Visual(推文為《高效繪圖小工具:Multi-omics Visual》)時,卻面臨打包發布較為複雜(相比於其他程式語言)的問題。
  • 基於webpack打包多頁應用,對前端工程化的思考
    前言在Vue,React 風靡的時代,加上基於框架衍生出來的各種腳手架,不得不說,現在 前端工程化 程度不遜色於任何端的開發隨著各種腳手架集成度的不斷提高,現在幾乎零配置就可以開發整個項目,俗稱傻瓜式開發是我們的代碼變傻了嗎?不!!
  • python、量化與「雅典娜」項目
    python、量化與「雅典娜」項目QQ群:124134140 (zwPython大數據,量化交易)今天,Q群裡面有朋友問道:【新人】yongle sunny(1535327967) 11:43:10   老大,我們老師說量化投資用python最好,但是現在網際網路上關於python搞量化並願意分享經驗的就您一家,而且還沒正式開始
  • 以正確的方式開源 Python 項目
    setuptools包(實際上就是對distutils的增強)簡單化了建立發布python包。使用setuptools給python包打包,和distutils打包沒什麼區別。這實在是沒有任何理由不使用它。setup.py應該放在你的項目的根目錄。setup.py中最重要的一部分就是調用setuptools.setup,這裡面包含了此包所需的所有元信息。
  • GitHub 上適合新手的 Python 開源項目
    如果你覺得手把手教你安裝 Python 之類是浪費時間,那麼我推薦 explore-python 這個項目。二、大神,我想學好 Python 2.1 先查收這份指南:python-guide項目地址:https://github.com/realpython/python-guide在線閱讀:https://pythonguidecn.readthedocs.io/zh/latest/首先感謝譯者們的辛勤付出,降低了《Python 最佳實踐指南》這份指南的閱讀門檻。
  • 超詳細的Python自學項目收集!
    如果你想從零開始學習Python程式語言,或者你想對Python的應用有更深入的了解,W3Cschool資深用戶收集的Python自學項目非常適合您。  1.Python手冊教程  Python很好用,要想深入並系統學習、了解一些機制,或者快速入門,亦或者有其他語言編程經驗的人簡單,想看一看就可以很快地開始編寫Python程序,那麼Python手冊教程可以說是好幫手。
  • 25 個 Python 學習項目,值得推薦!
    如果你是一位使用Python的開發人員,而且希望提高自己的技術水平,或者你想學習Python,那麼你可來對地方了。本文將為你獻上25個最佳GitHub代碼庫。1、最佳Python代碼庫Python資源精選列表1:Python框架、庫、軟體以及資源精選列表。
  • Python定時任務!這個項目我說能掙五千,你信嗎?
    ,幾個坑需要注意,crontab中請使用絕對路徑,因為crontab啟動程序時,相對路徑所對應的坐標系其實與你手動啟動該腳本時是不同的,使用絕對路徑省事,這裡還將star.sh腳本的輸出內容都重定向到對應的日誌文件中。
  • 【在線學Python】從入門到企業項目實戰!
    一階段:0基礎入門階段基礎專題Python入門教學Python常用函數階段介紹:三天入門python
  • Go技術日報(2021-01-30)——Go工程化(一) 架構整潔之道閱讀筆記
    三、#公眾號:代碼與遠方四、#公眾號:k8s技術圈五、#公眾號:後端早讀課六、#公眾號:Go招聘七、mohuishouWeek04: Go工程化參考資料[1]Go技術日報(2021-01-29): https://studygolang.com/topics/13055[2]Week04: Go工程化(一) 架構整潔之道閱讀筆記: https://lailin.xyz/post/go-training-week4-clean-arch.html[3]Issue 245 - Working
  • OpenCV-Python成為官方OpenCV項目
    曾為非正式但又廣為流行的OpenCV-Python軟體包現已成為官方OpenCV項目了!OpenCV-Python是Python的一個預編譯的只支持CPU的OpenCV包,使用pip install opencv-python便可在Windows、Linux(x86_64和aarch64)以及MacOS(x86_64)上安裝Python的OpenCV。