當前位置:首頁 » 編程語言 » python的包機制

python的包機制

發布時間: 2025-02-12 18:45:49

⑴ Rez入門教程(四): python包與環境構建

Rez入門教程(四): Python包與環境構建


對於新開發者,本教程旨在加速Rez的部署和包配置學習,特別針對Windows用戶,但同樣適用於Linux系統。這一節將深入講解如何創建Python包,使其支持在構建過程中執行Python命令。


首先,編寫一個包體構建腳本,如package.py。其中,`requires`參數定義了構建時所需的依賴,Rez會自動在安裝時綁定這些依賴。通過`build_command`,我們可以在包內運行Python腳本,如hello_world.py。執行構建後,可以看到hello_world.py腳本的指令被成功執行。


Rez環境中,Python程序的運行依賴於Rez而非系統環境變數。在初次安裝Rez時,這些環境變數已經設置。進一步理解,我們構建另一個包含init.py, python_env.py的包。在構建過程中,_init_.py腳本被調用,這個過程涉及到兩個關鍵的環境變數:



  • 一個指向包體源代碼的環境變數,即包文件結構的根目錄。

  • 另一個表示構建後包存放位置的環境變數,即構建完成後的包體位置。


通過觀察這些環境變數,我們可以深入理解Rez的運行機制和包的構建流程。

⑵ 如何編寫高質量的python程序

寫出規范的代碼是寫出高質量代碼的第一步,並且有助於培養仔細的習慣。

為了培養規范寫代碼的習慣,可以安裝flake8這個工具,它不僅可以檢查代碼風格是否符合官方建議(PEP8),而且還能找出潛在的隱患(用Pyflakes做語法分析),更逆天的是還能檢測到你有些函數寫的太復雜(代碼圈復雜度)了,更更逆天的是可以設置git commit之前必須通過這些檢查。

當然具體操作需要根據自己的項目進行一些定製,比如可以忽略E501,W293。

空白項目模版

好的開始是成功的一半,寫python代碼就從pyempty開始吧。

在github上看一下那些經典的項目,web.py,flask, pep8,他們的項目目錄都很規范,綜合借鑒了一些項目的特點,我寫了這個pyempty項目。

1.README.md 這里寫你項目的簡介,quick start等信息,雖然distutils要求這個文件沒有後綴名,但github上如果後綴是.md的話可以直接轉換成html顯示。

2.ChangeLog.txt 該文件存放程序各版本的變更信息,也有一定的格式,參考web.py的ChangeLog.txt

3.LICENES.txt 這里存放你項目使用的協議,不要編寫自己的協議。

4.requirements.txt 如果你的項目需要依賴其它的python第三方庫,在這里一行一個寫出來,可能pip install的時候能自動幫你安裝

5.setup.py 安裝腳本,後面詳細介紹

6.docs 裡面存放你的項目文檔,如概要設計,詳細設計,維護文檔,pydoc自動生成的文檔等,強烈推薦大家使用MarkDown格式編寫文檔

7.src 這個目錄里存放項目模塊的主要代碼,盡量不要把模塊目錄直接放到根目錄,模塊代碼目錄可以在setup.py里指定的

8.tests 這個目錄存放所有單元測試,性能測試腳本,單元測試的文件確保以test_做前綴,這樣distutils會自動打包這些文件,並且用python -m unittest discover -s ./ -p 'test_*.py' -v 可以直接執行這些測試

單元測試

Martin Fowler:"在你不知道如何測試代碼之前,就不該編寫程序。而一旦你完成了程序,測試代碼也應該完成。除非測試成功,你不能認為你編寫出了可以工作的程序。"

我們有很多理由不寫單元測試,歸根結底是懶,雖然代碼大全上說:

大部分研究都發現,檢測比測試的成本更小。NASA軟體工程實驗室的一項研究發現,閱讀代碼每小時能夠檢測出來的缺陷要比測試高出80%左右(Basili and Selby 1987)。後來,IBM的一項研究又發現,檢查發現的一個錯誤只需要3.5個工作時,而測試則需要花費15-25個工作時(Kaplan 1995)。

但是單元測試還是讓別人相信你的代碼有很高質量的最有力證據。

好了,請詳細閱讀:

深入python3.0: 單元測試-2.x也適用

Unit testing framework 不完整中文版

文檔

敏捷開發不是提倡什麼文檔也不寫,沒有文檔就沒有傳承和積累,輪崗或新人接手任務就會遇到很大的麻煩,所以我決定每個項目最少要寫以下文檔:

1.nalysis.model.md 概要設計文檔,不同於README.md文件,該文檔應該寫於項目開發之前,把項目有哪些功能,大概分幾個模塊等項目整體概述信息寫一下。

2.design.model.md 詳細設計文檔,不用太詳細,至少把項目依賴哪些東西,誰依賴這個項目,重要演算法流程描述,代碼整體結構等寫出來。

3.maintain.md 維護文檔,這個我覺得最重要,你的服務都記錄哪些日誌,需要監控哪些業務指標,如何重啟,有哪些配置項等,沒這些東西,你的項目很難運維。

上面這些文檔都是項目全局性的文檔,不適合寫在docstring或注視里,所以要有單獨的文檔。

打包

python有專門的模塊打包系統distutils,你可以用這套機制把你的代碼打包並分發到Pypi上,這樣任何人都可以用pip或easy_install安裝你的模塊。

如果你開發的是內部項目,還可以用mypypi架設私有的pypi,然後把項目的大的版本更新發布到內部的pypi上,配置管理人員和運維人員可以很方便的從pypi上拉取代碼安裝到測試環境或生產環境。

發布大版本的時候要給版本命名及編寫ChangeList,可以參考Git Pro的相關章節,主要記住以下幾個命令。

git tag -a v0.1 -m 'my test tag' #給大版本命名,打Tag
git describe master #給小版本命名,Git將會返回一個字元串,由三部分組成:最近一次標定的版本號,加上自那次標定之後的提交次數,再加上一段SHA-1值
git shortlog --no-merges master --not v0.1 #生成版本簡報,ChangeList
python有自己的打包機制,所以一般不要用git archive命令。

當然大版本管理用pypi管理比較合適,小的bug fix,緊急上線等好多公司都是用git直接從生產環境拉代碼更新,因為git,svn等可以很方便的撤銷某次更新,回滾到某個位置。

如何管理好大版本上線和小的緊急上線,我還沒理清思路,歡迎大家參與討論。

關於打包,請閱讀如下鏈接:

Python 打包指南

深入Python3.0:打包 Python 類庫

python打包:分發指定文件

出自:http://developer.51cto.com/art/201209/356603.htm

⑶ 深入了解Python的import機制

Python中官方定義,導入機制允許代碼在不同模塊間訪問,通過導入過程實現。日常開發中,我們常使用`from xxx import xxx`或`import xx`導入包。包中常包含`__init__.py`文件,引發好奇。本文將深度探討模塊/包與導入機制的載入、搜索過程,以Python 3.9.1文檔為參考。

模塊定義為邏輯上組織Python代碼的載體,本質是`.py`文件,通過`__name__`全局變數獲取模塊名,模塊內可執行語句僅執行一次,通常在模塊初始化時。

包則是通過層次結構組織模塊,可視為文件系統目錄中的文件,包可以包含子包和模塊。包與模塊並非必須來自文件系統,實質上,任何具有`__path__`屬性的模塊被視為包。包分為常規包和命名空間包,常規包包含`__init__.py`文件,命名空間包由部分構成,可位於不同位置或網路中。

導入系統允許模塊間訪問代碼,`import`語句是最常用方式,也可通過`importlib.import_mole()`或`__import__()`實現。`import`操作包括搜索和綁定模塊。搜索定義為對`__import__()`函數調用,返回值綁定當前作用域。`__import__()`直接調用僅執行搜索和創建模塊,可能引發副作用,如更新緩存

模塊搜索路徑包含內置模塊查找、sys.path目錄查找。導入`happy`時,首先檢查內置模塊,未找到則查找sys.path列表。sys.path初始值來源於文件系統路徑或環境變數,推薦避免模塊名與標准庫同名。擴展搜索路徑可通過`.pth`文件,添加絕對路徑後放入特定位置。

深入搜索涉及緩存、查找器和載入器。緩存`sys.moles`用於存儲已導入模塊,查找器確定模塊位置,載入器執行模塊載入。導入機制中,緩存`sys.moles`後,查找器`finder`確定模塊位置,通過`loader`載入模塊。查找器`finder`返回`mole spec`,`loader`執行模塊。

導入鉤子用於擴展導入機制,分為元路徑鉤子和導入路徑鉤子。元路徑鉤子在導入開始時被調用,處理系統路徑、內置模塊等,通過`sys.meta_path`注冊。導入路徑鉤子處理`sys.path`或`package.__path__`,通過`sys.path_hooks`注冊。

導入載入機制涉及`loader`對象執行模塊,`mole spec`封裝模塊導入信息,通過`mole.spec`公開。命名空間包不再依賴`__init__.py`文件,而是通過`__path__`屬性實現。基於元路徑查找器`PathBasedFinder`遍歷`sys.path`查找模塊,通過緩存`sys.path_importer_cache`減少重復匹配。路徑條目查找器`PathEntryFinder`用於解析特定路徑條目,實現模塊導入。

綜上所述,Python的導入機制通過模塊、包的組織,以及導入系統的搜索、載入過程實現模塊間代碼訪問。深入理解這些機制有助於優化代碼結構和導入效率。

熱點內容
pow在c語言中什麼 發布:2025-02-12 21:07:24 瀏覽:320
php查詢mysql連接 發布:2025-02-12 21:05:45 瀏覽:632
linuxc當前時間 發布:2025-02-12 21:03:32 瀏覽:28
雲鎖神伺服器 發布:2025-02-12 21:03:29 瀏覽:487
c語言int和float 發布:2025-02-12 21:03:24 瀏覽:20
我的世界有什麼好玩的大伺服器 發布:2025-02-12 21:01:59 瀏覽:98
方舟手游如何解鎖自己的伺服器 發布:2025-02-12 20:54:09 瀏覽:657
貓影視源碼 發布:2025-02-12 20:42:05 瀏覽:923
區域網如何訪問其他電腦 發布:2025-02-12 20:39:06 瀏覽:378
新平板電腦的數字密碼如何知道 發布:2025-02-12 20:31:19 瀏覽:345