與其他大多數(shù)編程語言一樣,Python/ target=_blank class=infotextkey>Python擁有強(qiáng)大的第三方支持,它們提供了各種各樣的工具。這些工具在創(chuàng)建應(yīng)用程序的過程中能夠大大增強(qiáng)Python的功能。調(diào)試器是一種工具,因為它是一種實用程序,而庫不是,庫是用來創(chuàng)建更好的應(yīng)用程序的。
即使我們把工具和非工具(比如庫)區(qū)分開,也不能讓工具的數(shù)量明顯減少。Python有大量常規(guī)工具和特殊工具的支持,這些工具被分成以下13類:
- 自動化重構(gòu)工具;Bug跟蹤工具;配置和構(gòu)建工具;部署工具;文檔工具;集成開發(fā)環(huán)境;Python調(diào)試器;Python編輯器;Python Shell;Skeleton Builder工具;測試軟件;有用模塊;版本控制。
值得注意的是,Python DevelopmentTools頁面上的列表是不完整的。除此之外,你還可以在其他一些網(wǎng)頁中看到大量的Python工具。
今天好學(xué)編程挑選了幾個需要特別關(guān)注的工具進(jìn)行講解。如果你對Python工具的內(nèi)容感興趣,你可以自己去網(wǎng)上查找一些其他工具學(xué)習(xí)一番。你可能會發(fā)現(xiàn),有些自己想創(chuàng)建的工具其實早就有了,而且不止一種。
1、使用Roundup Issue Tracker跟蹤Bug
現(xiàn)在有很多bug跟蹤站點可供我們使用,比如:Github、google Code、BitBucket、Launchpad。不過,這些公共站點用起來通常都沒有你自己定制的本地化Bug跟蹤軟件那樣方便。你可以在本地機(jī)器上選用多種跟蹤系統(tǒng),但是Roundup Issue跟蹤器是其中更好的一個。Roundup可以運(yùn)行在所有支持Python的平臺下,提供了如下基本功能:
- Bug跟蹤;管理TODO列表。
如果你愿意在安裝上多下點功夫,你就可以獲得更多的功能,這些額外功能體現(xiàn)的正是Roundup和其他產(chǎn)品不同的地方。但是,要獲取這些功能,你可能需要安裝其他產(chǎn)品,比如數(shù)據(jù)庫管理系統(tǒng)(DBMS)。Roundup的產(chǎn)品說明中指出了你要安裝什么以及它和哪些第三方產(chǎn)品是兼容的。安裝完成后,你會獲得如下這些功能。
- 客戶支持,包含如下:電話應(yīng)答向?qū)?;網(wǎng)絡(luò)鏈接;系統(tǒng)和開發(fā)問題跟蹤工具。互聯(lián)網(wǎng)工程任務(wù)組(Inte.NET Engineering Task Force,IETF)的問題管理。銷售趨勢跟蹤。會議論文投稿。雙盲評審管理。博客(目前還很簡陋,以后會變得很強(qiáng)大)。
2、使用VirtualEnv創(chuàng)建虛擬環(huán)境
創(chuàng)建虛擬環(huán)境的理由很多,但主要原因還是為了創(chuàng)造一個安全、已知的測試環(huán)境。每次都使用相同的測試環(huán)境,這樣可以保證應(yīng)用程序擁有穩(wěn)定的測試環(huán)境,直到你在類似產(chǎn)品的環(huán)境中完成足夠的測試。VirtualEnv為我們提供了創(chuàng)建虛擬Python環(huán)境的方法,你可以使用它進(jìn)行早期測試,或者診斷由環(huán)境原因引發(fā)的問題。請務(wù)必記住,你最少需要做3個標(biāo)準(zhǔn)級別的測試。
- Bug:檢查程序中的錯誤。性能:驗證程序是否滿足運(yùn)行速度、可靠性、安全性方面的要求??捎眯裕候炞C程序是否符合用戶需求,是否能夠按照用戶期望的方式響應(yīng)用戶輸入。
根據(jù)大多數(shù)Python應(yīng)用程序的使用方式,Python應(yīng)用程序在實際工作環(huán)境中通常不需要運(yùn)行在虛擬環(huán)境下。大多數(shù)Python應(yīng)用程序都需要訪問外部環(huán)境,但虛擬環(huán)境會阻止這種外部訪問行為。
永遠(yuǎn)不要在生產(chǎn)服務(wù)器上測試程序
一些開發(fā)人員常犯的一個錯誤是在生產(chǎn)服務(wù)器上測試尚未發(fā)布的程序,這使得用戶可以很容易地訪問到它。永遠(yuǎn)不要在生產(chǎn)服務(wù)器上測試你的程序,原因有很多,其中最重要的一個是這樣做會導(dǎo)致數(shù)據(jù)丟失。如果允許用戶訪問尚未正式發(fā)布的程序,而這個程序又包含可能會損壞數(shù)據(jù)庫或其他數(shù)據(jù)源的Bug,這樣就有可能造成數(shù)據(jù)的永久丟失或損壞。
你還要注意,你只有一次贏得別人好感的機(jī)會。許多軟件項目的失敗是因為用戶最終拋棄了它。即便應(yīng)用程序是完整的,但是沒有人會使用它,因為用戶認(rèn)為應(yīng)用程序在某些方面存在缺陷。用戶心中只有一個目標(biāo),那就是盡快完成工作,然后回家。當(dāng)用戶發(fā)現(xiàn)某個程序在浪費(fèi)他們的時間時,他們就不會再使用它了。
此外,未發(fā)布的應(yīng)用程序有可能存在安全漏洞,心懷惡意的人可能利用這些漏洞非法訪問你的網(wǎng)絡(luò)。如果你的門是開著的,任何人都能進(jìn)來,那不管你的安全軟件有多棒都沒什么用。當(dāng)他們進(jìn)來之后,你再想擺脫他們幾乎是不可能的,即使你真的擺脫了他們,但這時對數(shù)據(jù)的損害已經(jīng)發(fā)生了。從安全漏洞恢復(fù)是很難的,有時甚至是不可能的。簡而言之,永遠(yuǎn)不要在生產(chǎn)服務(wù)器上測試你的應(yīng)用程序,這樣做的成本太高了。
3、使用PyInstaller安裝你的應(yīng)用程序
一般,用戶都不希望在應(yīng)用程序安裝上花費(fèi)太多時間,不管這個程序最終會給他們帶去多大的幫助都是如此。即使你可以讓用戶去嘗試安裝程序,但不太懂計算機(jī)的用戶也有可能會安裝失敗。簡而言之,你需要有一種萬無一失的方法,幫助用戶把程序順利地安裝到自己的計算機(jī)中。PyInstaller 可以幫你做到這一點,它會為你的應(yīng)用程序生成了一個安裝包,用戶使用這個安裝包就可以很容易地把程序安裝到自己的系統(tǒng)中。
幸運(yùn)的是,PyInstaller可以在所有支持Python的平臺上工作,所以你只需要一個工具就可以滿足所有安裝需求。另外,必要時,你還可以獲得特定平臺的支持。例如,在windows平臺下,你可以創(chuàng)建有代碼簽名的可執(zhí)行文件。mac開發(fā)人員很喜歡PyInstaller為bundle提供了支持。大多數(shù)情況下,盡量避免使用特定于平臺的特性,除非你真的需要它們。當(dāng)你使用了特定于某個平臺的特性時,安裝只能在這個平臺上才能成功。
不要使用孤立的工具
網(wǎng)絡(luò)上有一些Python工具是孤立的,其開發(fā)者已不再支持它們。但有些開發(fā)人員仍然在使用這些工具,因為他們喜歡這些工具所支持的特性或工作方式。但是,這樣做是有風(fēng)險的,因為你不能確定這個工具是否能和最新版本的Python協(xié)同工作。選擇工具時,要盡量選擇那些受生產(chǎn)廠商完全支持的工具。
如果你必須使用孤立的工具(例如做某個工作時只有孤立的工具可用),那請你確保所用的工具仍然有良好的社區(qū)支持?;蛟S工具的生產(chǎn)商已經(jīng)不再存在了,但至少在你需要支持時,有社區(qū)為你提供有用的信息。請注意,使用那些不受支持的工具可能會浪費(fèi)你大量的時間,因為它們可能無法正常工作了。|
我們在網(wǎng)上找到的許多安裝工具都是特定于某個平臺的。例如,當(dāng)你尋找一款用于創(chuàng)建可執(zhí)行文件的安裝工具時,你需要注意這個工具創(chuàng)建出的可執(zhí)行文件是不是特定于某個平臺的(至少在你指定的平臺上可以運(yùn)行)。重要的是,你選用的安裝工具在任何地方都能正常工作,這樣就不會創(chuàng)建出用戶無法使用的安裝包。如果安裝包有問題,那不管你選用什么樣的跨平臺語言都無濟(jì)于事。
4、使用pdoc創(chuàng)建開發(fā)人員文檔
與應(yīng)用程序有關(guān)的文檔有兩種:用戶文檔和開發(fā)人員文檔。用戶文檔介紹如何使用應(yīng)用程序,而開發(fā)人員文檔則描述應(yīng)用程序如何工作。庫只需要一種文檔,即開發(fā)者文檔,而桌面應(yīng)用程序則只需要用戶文檔。但是,服務(wù)可能同時需要這兩種文檔,這取決于用戶是誰以及服務(wù)如何組合在一起。大多數(shù)文檔可能都會影響到開發(fā)人員,而pdoc是一個創(chuàng)建它的簡單解決方案。
pdoc實用工具使用你插入到代碼中的文檔字符串和注釋來創(chuàng)建文檔,其輸出是文本文件或html文檔。你還可以讓pdoc以Web服務(wù)器的方式運(yùn)行,這樣人們可以直接在瀏覽器中查看文檔。pdoc實際是epydoc的替代品,現(xiàn)在epydoc的發(fā)起人已經(jīng)不再支持epydoc了。
什么是文檔字符串?
文檔字符串是一種特殊注釋,使用三重引號括起,如下所示:
"""This is a docstring."""
你可以把文檔字符串和一個對象關(guān)聯(lián)起來,例如包、函數(shù)、類和方法。在Python中,你創(chuàng)建的任何代碼對象都可以有一個文檔字符串。文檔字符串的目的是描述對象,因此要使用描述性的語句。
查看文檔字符串最簡單的方法是在對象名稱之后使用doc()方法。比如,鍵入print(MyClass.doc())將顯示MyClass的文檔字符串。此外,你還可以使用幫助(比如help(MyClass))來訪問文檔字符串。好的文檔字符串用來指出對象做什么,而非如何去做。
此外,第三方實用工具也可以使用文檔字符串。借助于合適的實用工具,你可以為整個庫編寫文檔,而不必親自動手編寫。你使用的實用工具會通過庫中的文檔字符串來創(chuàng)建文檔。如此看來,即使文檔字符串和注釋有著不同的用途,但它們在Python代碼中同樣重要。
5、使用Komodo Edit編寫程序代碼
選擇IDE時,主要看開發(fā)者的需求、技能水平以及要創(chuàng)建的應(yīng)用程序類型。具體到某類應(yīng)用程序的開發(fā),有些IDE的確要比其他的好用。對開發(fā)新手來說,最好用的IDE當(dāng)數(shù)Komodo Edit。你可以免費(fèi)下載這個IDE,它包含了豐富的特性,讓你獲得比使用IDLE更好的編碼體驗。下面是Komodo Edit提供的一些功能:
- 支持多種編程語言;關(guān)鍵字自動補(bǔ)全;縮進(jìn)檢查;項目支持,自動生成部分程序代碼;良好支持。
但是,Komodo Edit和其他IDE有個明顯的不同,那就是它提供了一個升級路徑。當(dāng)你發(fā)現(xiàn)Komodo Edit無法再滿足你的需求時,你可以升級到Komodo IDE,Komodo IDE包含對許多專業(yè)級特性的支持,比如代碼分析(檢查應(yīng)用程序速度的功能)和數(shù)據(jù)庫瀏覽器(讓數(shù)據(jù)庫更易用)。
6、使用pydbgr調(diào)試程序
高端IDE(如Komodo IDE)都會帶有完整的調(diào)試器,就連Komodo Edit也帶有一個簡單的調(diào)試器。但是,如果你選用的是體量更小、價格更便宜、功能更少的IDE,那你可能根本就看不到有調(diào)試器存在。調(diào)試器可以幫你找出程序中的錯誤并修復(fù)它們。調(diào)試器越好,查找和修復(fù)錯誤所需要的工作量就越少。如果你使用的代碼編輯器不帶調(diào)試器,那你一定要找個外部調(diào)試器使用,比如pydbgr。
一款好的調(diào)試器包含許多標(biāo)準(zhǔn)特性,比如代碼著色(使用顏色來表示關(guān)鍵字之類的內(nèi)容)。除此之外,不同調(diào)試器各自還有一些非標(biāo)準(zhǔn)特性,這使它們彼此不同。下面是pydbgr的一些標(biāo)準(zhǔn)和非標(biāo)準(zhǔn)特性,如果你用的代碼編輯器沒有附帶調(diào)試器,pydbgr會是一個不錯的選擇。
- 智能求值:求值命令幫助我們了解執(zhí)行某行代碼時會發(fā)生什么,當(dāng)然指的是這行代碼在程序中實際運(yùn)行之前。它有助于我們進(jìn)行假設(shè)分析,用以了解程序中有哪些地方可能會出現(xiàn)問題??邕M(jìn)程調(diào)試:一般來說,我們只能調(diào)試駐留在同一臺機(jī)器上的應(yīng)用程序。實際上,調(diào)試器是應(yīng)用程序進(jìn)程的一部分,這意味著調(diào)試器本身可能會妨礙到調(diào)試過程。為此,我們可以使用跨進(jìn)程調(diào)試,這樣調(diào)試器就不會影響到應(yīng)用程序,你甚至可以不必在與調(diào)試器相同的機(jī)器上運(yùn)行應(yīng)用程序。全面字節(jié)碼檢查:有時,查看代碼轉(zhuǎn)換為字節(jié)代碼(Python解釋器真正理解的代碼)的過程有助于我們解決棘手的問題。事件過濾和跟蹤:當(dāng)你的程序在調(diào)試器中運(yùn)行時,它會產(chǎn)生一些事件,這些事件可以幫助調(diào)試器了解發(fā)生了什么。比如,移動到下一行代碼會產(chǎn)生一個事件,從函數(shù)調(diào)用返回會產(chǎn)生另一個事件,等等。借助這個功能,我們可以控制調(diào)試器如何跟蹤應(yīng)用程序以及對哪些事件做出反應(yīng)。
7、使用IPython進(jìn)入交互環(huán)境
Python Shell可以很好地應(yīng)用在許多交互任務(wù)中。但是,如果你使用過它,你可能已經(jīng)發(fā)現(xiàn)它有一些缺陷。其中,最大的缺陷是Python Shell是純文本環(huán)境,你必須在其中鍵入命令來執(zhí)行給定的任務(wù)。更高級一點的Shell,比如IPython,支持GUI界面,這使交互環(huán)境更友好,這樣你就不必記憶各種古怪的命令了。
其實,IPython不僅僅是一個簡單的Shell。它提供了一個環(huán)境,你可以在這個環(huán)境中以新的方式和Python進(jìn)行交互,例如以圖形方式顯示你使用Python創(chuàng)建的公式的結(jié)果。此外,IPython還是一個容納其他語言的前端。IPython應(yīng)用程序向后臺的真正的Shell發(fā)送命令,因此你可以使用其他語言的Shell,比如Julia和Haskell。(即使你從未聽說過這些語言,也不必?fù)?dān)心。)
IPython最令人興奮的特性之一是它能夠在并行計算環(huán)境下工作。一般Shell都是單線程的,這意味著什么并行計算都做不了,你甚至不能創(chuàng)建多線程環(huán)境。僅憑這個特性,IPython就值得你試一試。
8、使用PyUnit測試Python應(yīng)用程序
某些時候,你需要測試一下自己的應(yīng)用程序,以確保它們按照預(yù)期工作。測試時,你可以通過一次輸入一個命令并驗證結(jié)果來進(jìn)行測試,或者將這個過程自動化。顯然,自動化這個方法會更好,因為你可不想把所有時間都花在測試上,連回家吃飯的時間都沒有了,而且手工測試非常非常慢(尤其是當(dāng)你犯了錯誤時,這種情況肯定會發(fā)生)。PyUnit等工具極大地簡化了單元測試(對單個特性進(jìn)行的測試)過程。
PyUnit的優(yōu)點是允許你創(chuàng)建真實的Python代碼來執(zhí)行測試。簡單地說,你編寫的腳本是另一個專門的程序,用于測試主應(yīng)用程序是否有問題。
或許你會覺得腳本(非你專門編寫的應(yīng)用程序)中可能會有很多Bug。其實,測試腳本一般都設(shè)計得非常簡單,這會大大減少腳本中的錯誤,并讓腳本中的錯誤很容易被發(fā)現(xiàn)。即便如此,錯誤有時還是會出現(xiàn)。因此,當(dāng)你無法找到應(yīng)用程序中的問題時,你就的確需要檢查一下腳本了。
9、使用Isort整理代碼
整理代碼看上去像是一件很小的事,但是如果你不注意這一點,你的代碼很可能會變得亂糟糟的,尤其是當(dāng)你沒有把所有import語句按照字母順序放到文件頂部時,代碼看起來會更亂。在某些情況下,如果你的代碼不夠整潔,你就很難(并非不可能)弄清楚它到底怎么了。Isort實用程序只對import語句進(jìn)行排序,并確保它們?nèi)课挥谠创a文件的頂部,這看上去微不足道,但對你理解和修改源代碼有很大的幫助。
有時只要了解某個特定模塊需要哪些模塊,就可以幫助我們快速找出潛在的問題。例如,你的系統(tǒng)中安裝了某個老版本的模塊,那了解應(yīng)用程序都需要哪些模塊就可以使查找那個模塊的過程變得更容易。
此外,在把應(yīng)用程序分發(fā)給用戶時,了解應(yīng)用程序需要哪些模塊也很重要。只有用戶的系統(tǒng)中安裝了程序所需要的模塊,才能確保程序按照預(yù)期運(yùn)行。
10、使用Mercurial進(jìn)行版本控制
你在學(xué)習(xí)本書的過程中創(chuàng)建的那些應(yīng)用程序其實都不復(fù)雜。事實上,在你讀完這本書并轉(zhuǎn)向更高級的學(xué)習(xí)之后,你都不太可能需要版本控制。不過,當(dāng)你進(jìn)入一個有組織的開發(fā)環(huán)境中工作、實際開發(fā)滿足用戶需求的應(yīng)用程序時,版本控制就變得非常重要。簡單地說,版本控制就是跟蹤發(fā)布到實際生產(chǎn)環(huán)境中的不同程序版本,并記錄不同程序版本之間發(fā)生的變化。當(dāng)你說你在使用MyApp 1.2時,你指的是MyApp應(yīng)用程序的1.2版。為程序打版本標(biāo)識很有意義,當(dāng)程序修改了缺陷或進(jìn)行了改進(jìn)之后,版本標(biāo)識能夠讓人們知道自己使用的是哪一個版本。
Python版本控制工具有很多種,其中比較有趣的工具是Mercurial。對于幾乎所有可運(yùn)行Python的平臺,Mercurial都提供了相應(yīng)版本,這樣在更換平臺時你就不必再擔(dān)心無法使用Mercurial了。(對于你使用的平臺,如果Mercurial沒有提供相應(yīng)的可執(zhí)行文件,你可以從官方站點下載Mercurial源代碼自己構(gòu)建一個。)
與其他產(chǎn)品不同,Mercurial是免費(fèi)的。即便你打算以后改用其他更高級的產(chǎn)品,你也可以從使用Mercurial管理一個或兩個項目的過程中獲得有用的經(jīng)驗。
源代碼管理(SCM)是指把應(yīng)用程序的各個版本存儲在不同的地方,以便根據(jù)需要撤消或重做對源代碼所做的修改。對許多人來說,源代碼管理似乎是一項艱巨的任務(wù)。Mercurial環(huán)境相當(dāng)友好,你可以在其中學(xué)習(xí)SCM。當(dāng)你需要返回到程序的舊版本或修復(fù)新版本中出現(xiàn)的問題時,應(yīng)用程序各個版本的源代碼必須可用才行。
Mercurial最棒的地方在于它有一個很好的在線教程。學(xué)習(xí)SCM最好的方法是在你自己的機(jī)器上一步步地跟學(xué),哪怕只是翻一翻這些材料也是很有用的。教程的第一部分是關(guān)于如何安裝Mercurial的。然后,教程講解如何創(chuàng)建存儲庫(存儲應(yīng)用程序各個版本的地方),并在創(chuàng)建應(yīng)用程序代碼時使用存儲庫。學(xué)完這個教程之后,你會對源代碼控制的原理以及為什么版本控制是應(yīng)用程序開發(fā)的一個重要部分有很好的了解。