Python 二三事 安裝 使用經(jīng)驗

Python 二三事

面向初學(xué)者介紹Python相關(guān)的一些工具,以及可能遇到的常見問題仿荆。

最后更新 2013.5.26

之前有兩篇同名的文章發(fā)在網(wǎng)上贰您,在這里編輯整合在一起放在這里。

相關(guān)文章 -Python 四五事

引言

在這里我假設(shè)你已經(jīng)看完了一篇Python教程拢操,基本熟悉了Python的結(jié)構(gòu)和語法锦亦,在命令行下的Python互動環(huán)境中嘗試過大部分Python的語句,覺得Python是個不錯的語言準(zhǔn)備繼續(xù)下去令境。那么本篇文章會就Python實際運用中相關(guān)工具的選擇杠园,包括IDE,調(diào)試套件舔庶,第三方庫管理工具這些進(jìn)行介紹抛蚁。另外還會對某些中文環(huán)境下容易遇到的問題,例如unicode編碼解碼的問題進(jìn)行說明惕橙。本文主要是針對 Windows 環(huán)境下的 Python 開發(fā)進(jìn)行說明瞧甩。文章的目的是為了分享些我覺得很有用的經(jīng)驗和例子,若發(fā)現(xiàn)文中有疏漏之處請務(wù)必聯(lián)系我弥鹦。謝謝肚逸。

Python 語言介紹

Python 是一個近些年在開始流行起來的計算機編程語言。根據(jù)Python官網(wǎng)上的簡介,Python主要特性包括跨平臺朦促,免費膝晾,簡單且容易維護(hù)。就我個人理解來說思灰,Python是一門適合大部分人的語言玷犹,因為各種類型的第三方庫都有,所以像簡單桌面程序洒疚,動態(tài)網(wǎng)站開發(fā)歹颓,圖像處理,表格處理油湖,甚至自動發(fā)帖機這些小應(yīng)用在簡單的學(xué)習(xí)后巍扛,不需要很深厚的編程經(jīng)驗的人應(yīng)該都能自己做出來。

一些流行的Python教程有:

Dive into Python面向有一定編程基礎(chǔ)的同學(xué)乏德。另外還有Dive into Python 3撤奸,針對Python3的教程。

Learn Python The Hard Way喊括,書中主要是通過各種練習(xí)來進(jìn)行學(xué)習(xí)胧瓜,面向完全沒有編程經(jīng)驗的同學(xué)。

Invent Your Own Computer Game With Python郑什,讓你一上手就做個游戲出來的教程府喳,厲害吧。

The Python Tutorial蘑拯,官方文檔中的教程钝满,正統(tǒng)而完整。

如果你還沒有開始接觸 Python 申窘,或者覺得還不夠熟悉弯蚜,那么不妨找一份你覺得看得下去的教程開始學(xué)習(xí)吧。就我個人經(jīng)驗來說剃法,Python 是我到目前為止覺得學(xué)的最劃得來的一門語言碎捺,也是日常用的最多的一門,而事實上你并不需要了解完全了解 Python 就能在開始使用它玄窝。

Python 版本選擇牵寺,其他發(fā)行版

Python 2 與 3

Python 2 和 3 系列的選擇可能是比較讓人煩躁的事情。其實區(qū)別很簡單:Python 3.x 各個方面都更好恩脂,但語法與 Python 2.x 很大部分不兼容帽氓。Python 2.x 已經(jīng)停止繼續(xù)開發(fā)。但是目前很多第三方庫仍然不支持 Python 3 , 文章后面介紹的很多工具俩块,特別是科學(xué)計算的庫仍然只支持 Python 2.x黎休。

原來這里寫的推薦版本是 2.6浓领,現(xiàn)在的情況是 2.7 版本是 2.x 系列最后一個大版本號,以后只會有 2.7.x 的維護(hù)版本并不再會添加新功能势腮。Python 3 現(xiàn)在已經(jīng)足夠成熟联贩,很多常見的庫都已經(jīng)移植到 Python 3 上了。所以現(xiàn)在如果你是自己學(xué) Python 那么上來直接 Python 3 沒啥問題捎拯,但如果你是在工作的地方或者對科學(xué)計算有要求那么還是需要 Python 2.7 比較好泪幌。

這里我發(fā)現(xiàn)有一個比較靠譜的選擇辦法,就是看 Python(x,y) 帶的 Python 版本署照。它現(xiàn)在還是在 2.7祸泪,這個版本基本上所有的第三方庫都在支持。當(dāng)哪一天 Python(x,y) 上到 Python 3 了那估計就是可以安心用 Python 3 的時候了建芙。但按現(xiàn)在這個情況估計還得好幾年吧没隘。

發(fā)行版

目前在 Windows 下除了官方提供的安裝版外,還有:

ActivePython禁荸,這個與官方版本的區(qū)別在于提供了額外的庫和文檔右蒲,并且自動設(shè)置了PATH環(huán)境變量(后文會詳細(xì)提到)

Python(x,y),這個是我一直用并且推薦給別人用的版本赶熟。從名字就能看出來這個發(fā)行版附帶了科學(xué)計算方面的很多常用庫瑰妄,另外還有大量常用庫比如用于桌面軟件界面制作的PyQt, 還有文檔處理,exe文件生成等常用庫映砖。另外的還有大量的工具如IDE翰撑,制圖制表工具,加強的互動shell之類啊央。很多下文提到的軟件在此發(fā)行版中都有附帶。其他方面涨醋,Python(x, y)還附帶了手工整理出的所有庫的離線文檔瓜饥,每個小版本升級都提供單獨的補丁≡÷睿總的來說是很用心維護(hù)的一個發(fā)行版乓土,十分建議安裝這個版本。

Conda, 一個類似 Python(x, y) 的輕量級發(fā)行版溯警。他支持的庫稍微少一點但是常用的也基本包括了趣苏,它提供了一個額外的包裹管理命令還支持 Python 3.x,同時提供簡潔版的Miniconda供自己手動選擇庫進(jìn)行下載梯轻。

開發(fā)相關(guān)工具

首先食磕,你需要一份文檔

對于 Python 這樣的語言,你覺得你學(xué)到什么時候算是完全掌握呢喳挑?你也許會想也許哪一天你記得大部分函數(shù)的名字很怎么用彬伦,不用打幾行就 Google 搜一下的時候滔悉,就算學(xué)會了。這樣的理解對了一半单绑,等你熟悉 Python 以后你的卻不應(yīng)該常搜索回官;但前一半?yún)s不一定,我個人認(rèn)為你并不需要記住龐大的標(biāo)準(zhǔn)庫中的內(nèi)容搂橙,很多時候你只要清楚要在哪里能找到相應(yīng)的文檔就行了歉提。

Python 在這方面可以說是做的非常非常非常好。在真正著手開發(fā)之前区转,你應(yīng)該在下載一份離線的文檔苔巨。在這個頁面(如果打不開的話試試這里,你懂的)下載一份 HTML 格式的蜗帜,比如是 2.7.3 版那么對應(yīng)的文檔名字應(yīng)該是python-2.7.3-docs-html.zip恋拷。下好后把它在一個你喜歡的地方解壓出來,打開其中的index.html,這就是這個文檔的主頁。你可以看到他分為很多部分念逞,包括語言的參考损肛,標(biāo)準(zhǔn)庫和其他很多方便的文檔。

如果你一下不知道從哪里看起胎源,這份文檔還有一個非常棒的功能。看到左邊的Quick Search欄舷胜,我在上圖中也有標(biāo)注起來。當(dāng)你需要對某個函數(shù)或者標(biāo)準(zhǔn)庫進(jìn)行進(jìn)一步了解的時候活翩,你可以在這邊來進(jìn)行搜索烹骨。這里的搜索是火星科技驅(qū)動的離線狀態(tài)下也能夠使用的!比如輸入urllib.urlencode材泄,你可以很方便的找到它對應(yīng)的頁面沮焕。基本有了這份文檔拉宗,你可以避免掉很多瘋狂搜索的情況峦树。同樣的,當(dāng)你使用某個第三方庫的時候旦事,你最好也在他的站點上找找有沒有一份離線文檔魁巩,因為 Python 項目很多都有著很贊的文檔。

開發(fā)環(huán)境的選擇

如果你選擇用 IDE 的話姐浮,現(xiàn)在的選擇就非常多了谷遂,包括PyCharm,Python Tools for Visual Studio。你也可以硬派一點用一個文本編輯器直接寫单料。但我強烈建議不要使用 Python 發(fā)行版自帶的那個 IDLE埋凯。開發(fā)者沒有真的認(rèn)為誰會仔細(xì)用那它点楼,一直以來沒有什么新功能,運行效率不行白对,而且會出詭異的問題(比如會報什么 socket 錯誤)掠廓。希望你花些時間找個順手的工具,只要不是 IDLE 就可以甩恼。

選擇 PyDev 作為 IDE

Python 集成開發(fā)環(huán)境的選擇好像一直以來也是一個很難抉擇的問題蟀瞧。在嘗試過很多個工具后我發(fā)現(xiàn)基于 Eclipse 的PyDev絕對是功能最為完整的一個 IDE 。除了斷點調(diào)試之外条摸,PyDev 的代碼自動補全可能是現(xiàn)在這類 IDE 中最強力的悦污。

如果你安裝了Python(x, y)的話,PyDev 就已經(jīng)在你的機器上了钉蒲。如果沒有的話請按照這篇文章來進(jìn)行安裝切端。

設(shè)置上有一些需要注意的地方。首先在打開 PyDev 顷啼,打開菜單中Window -> Preferences踏枣,在彈出對話框中左邊找到PyDev -> Editor -> Code Completion。這里可以設(shè)置代碼自動補全的相關(guān)信息钙蒙∫鹌伲可以降低 Autocompletion delay 來更早的提示代碼,并且將 Request completion on 系列盡可能勾上躬厌,讓 PyDev盡可多的提示代碼马昨。

之后再找到Interpreter Python選項卡,這里可以設(shè)置所謂 Forced Buildins扛施,可以強制引入某些第三方庫從而完成代碼補全鸿捧。就我的經(jīng)驗來看大部分第三方庫在這樣設(shè)置后都能進(jìn)行基本的補全。具體的做如圖中疙渣,選擇到對應(yīng)的選項卡笛谦,點擊 New,并輸入你需要的模塊名字即可昌阿。

設(shè)置后總體效果絕對是同類IDE中比較好的:

IPython 替代 Python Shell

在學(xué)習(xí) Python 的時候應(yīng)該都接觸過 Python 的 Shell,能夠輸入 Python 語句并且立即返回結(jié)果恳邀。而IPython就是一個豪華加強版的 Python Shell懦冰。如果你安裝了 Python(x, y) 的話,那 IPython 已經(jīng)在你的機器上了谣沸。如果沒有的話那么請在這里下載 Windows Installer進(jìn)行安裝刷钢。在安裝這個之后還需要安裝pyreadline讓 IPython 開啟高亮和自動補全功能。

之后你在命令行下需要 python 的時候改為輸入ipython就能使用它了乳附。開啟 IPython 看看内地,首先感覺的不同應(yīng)該是這個是有顏色的伴澄。我們來看看它提供的一些基礎(chǔ)而實用的功能吧。首先是自動補全阱缓,一種是簡單的關(guān)鍵字補全非凌,另外一種是對象的方法和屬性補全。作為例子荆针,我們先引入sys模塊敞嗡,之后再輸入sys.(注意有個點),此時按下 tab 鍵航背,IPython 會列出所有 sys 模塊下的方法和屬性喉悴。因為是在互動模式下進(jìn)行的,此時的 Python 語句實實在在的被執(zhí)行了玖媚,所以對普通 object 的補全也是很完好的箕肃。

接著上面的例子,我們輸入sys?今魔,這樣會顯示出sys模塊的 docstring及相關(guān)信息勺像。很多時候這個也是很方便的功能。

IPython 實用技巧

這里再介紹下 IPython 使用中的一些實用功能涡贱。在學(xué)習(xí) Python 時你可能看到在循環(huán)或者函數(shù)返回時可以賦值給_來表示忽略某個返回值咏删。其實這只是一個常用的習(xí)慣。事實上_是一個合法的變量名问词,而且在 Python shell 下_總是被賦予之前最后一個輸出的值督函。這里看個例子應(yīng)該就能清楚:

>>> import string

>>> string.letters

'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ

>>> print _

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ

舉個實際的例子,比如你在調(diào)試時讀文件的時候直接進(jìn)行f.read()激挪,你看了看發(fā)現(xiàn)輸出結(jié)果很有意思辰狡,想要對它進(jìn)行進(jìn)一步處理,但發(fā)現(xiàn)讀的時候忘記賦值了垄分。以往你只能嘆嘆氣重新開文件再讀一次宛篇,現(xiàn)在你只要執(zhí)行result = _,把_附到另外一個變量就可以了薄湿。

IPython 還有強大之處很大部分還體現(xiàn)在它的magic function中叫倍。它是指的在 IPython 環(huán)境下執(zhí)行以%開頭的一些命令來對 IPython 進(jìn)行一些設(shè)定或者執(zhí)行某些功能。在 IPython 中輸入%lsmagic就能列出所有的magic functions豺瘤。在這里簡單介紹下幾個比較有意思的吆倦,你也可以自己通過查看文檔來找找有哪些你特別用的到得。

之前看到能用?來查詢函數(shù)的文檔坐求,對于 magic function 也是如此蚕泽。比如%run?。

!cd ..在命令前面加上!則它會被作為命令行命令執(zhí)行桥嗤,這樣你就不用退出 IPython 來進(jìn)行命令行操作须妻。

%run foo.py在當(dāng)前環(huán)境下直接執(zhí)行foo.py仔蝌,效果跟命令行下調(diào)用ipython foo.py相同。

%time foo.bar()跟timeit decorator作用相同荒吏,進(jìn)行簡單的 profile敛惊。

%hist能顯示之前輸入過的命令的歷史,同時你可以用In[]來訪問之前的命令司倚。比如%exec In[10]就能執(zhí)行列表中第十行豆混。

%rep類似上面的_變量,但是是以字串的形式返回

最后动知,如果%automagic是打開的狀態(tài)的話皿伺,所有 magic function 不需要在前面加%就能正確調(diào)用。

在當(dāng)前 IPython 版本中還有一個由于安全原因沒有默認(rèn)引入的%autoreload盒粮,它的作用是在可以自動重新載入你調(diào)用的函數(shù)鸵鸥,以及其相關(guān)模塊。接觸過django的同學(xué)對這個應(yīng)該比較熟悉丹皱,在 IPython 中的效果就是妒穴,當(dāng)你在調(diào)試一個一直在反復(fù)改動的函數(shù)時,你可以開啟這個功能保證每次調(diào)用都會重新讀取最新的版本摊崭,讓你在源碼中的改動馬上生效讼油。在 IPython 中執(zhí)行

import ipy_autoreload

%%autoreload 2

這樣 IPython 會對所有的模塊都進(jìn)行 autoreload。你可以通過執(zhí)行%autoreload?來查詢它的文檔來進(jìn)行進(jìn)一步設(shè)定呢簸。如果你希望 IPython 每次啟動自動載入次功能矮台,那么可以通過配置 ipythonrc (在 Windows 下可以在C:\Users\\_ipython\ipythonrc.ini找到) 來進(jìn)行相關(guān)設(shè)置。

最后還有一個很神奇的功能根时。如果你的程序是由命令行開始執(zhí)行的瘦赫,即在命令行下輸入python foo.py(大部分 Python 程序都是),那么你還可以利用 IPython 在你的程序任意地方進(jìn)行斷點調(diào)試蛤迎!在你程序中任意地方确虱,加入如下語句:

from IPython.Shell import IPShellEmbed

IPShellEmbed([])()

注意:最近 IPython 發(fā)布了0.11 版本,各方面變化都非常大替裆,API 也經(jīng)過了重新設(shè)計校辩。如果你使用的是 0.11 那么上面兩行對應(yīng)的是這樣的:

from IPython import embed

embed()

再和平常一樣運行你的程序,你會發(fā)現(xiàn)在程序運行到插入語句的地方時辆童,會轉(zhuǎn)到 IPython 環(huán)境下召川。你可以試試運行些指令,就會發(fā)現(xiàn)此刻 IPython 的環(huán)境就是在程序的那個位置胸遇。你可以逐個瀏覽當(dāng)前狀態(tài)下的各個變量,調(diào)用各種函數(shù)汉形,輸出你感興趣的值來幫助調(diào)試纸镊。之后你可以照常退出 IPython倍阐,然后程序會繼續(xù)運行下去,自然地你在當(dāng)時 IPython 下執(zhí)行的語句也會對程序接下來的運行造成影響逗威。

這個方法我實在這里看到的峰搪。想象一下,這樣做就像讓高速運轉(zhuǎn)的程序暫停下來凯旭,你再對運行中的程序進(jìn)行檢查和修改概耻,之后再讓他繼續(xù)運行下去。這里舉一個例子罐呼,比如編寫網(wǎng)頁 bot 鞠柄,你在每取回一個頁面后你都得看看它的內(nèi)容,再嘗試如何處理他獲得下一個頁面的地址嫉柴。運用這個技巧厌杜,你可以在取回頁面后讓程序中斷,再那里實驗各種處理方法计螺,在找到正確的處理方式后寫回到你的代碼中夯尽,再進(jìn)行下一步。這種工作流程只有像 Python 這種動態(tài)語言才可以做到登馒。

pip 管理第三方庫

Python 的一大優(yōu)勢就是有極為大量的第三方庫匙握,包括各個方面的引用。然而安裝第三方庫對沒有掌握方法的同學(xué)來說會變得很讓人煩惱陈轿。事實上 Python 第三方庫的安裝和管理有著一個一個唯一正確的做法圈纺,這個做法要求你什么其他的都不用干,只要輸入你要安裝庫的名字就可以了济欢。

setuptools 也包在 Python(x, y) 當(dāng)中赠堵。如果沒有的話,要首先先安裝setuptools法褥,這個其實就是一個安裝第三方庫的軟件茫叭。選擇對應(yīng)版本的 Windows Installer 進(jìn)行下載和安裝后,打開一個命令行窗口半等,輸入:

easy_install pip

如果提示找不到程序揍愁,那么說明你當(dāng)前沒有設(shè)定好環(huán)境變量。安裝官方提供的 Python 安裝包的話肯定會有這個問題杀饵,而且很可能暫時不會修正莽囤,這就是牛逼程序員的倔強。具體做法是 右鍵我的電腦 - 屬性 - 高級系統(tǒng)設(shè)置 - 環(huán)境變量 - 將C:\python2*\Scripts加入到 PATH 那一組當(dāng)中切距。這樣做的效果就是在任何地方的命令行下輸入命令朽缎,那么系統(tǒng)會額外查找我們設(shè)定的那個目錄中的內(nèi)容。之后再執(zhí)行上面的命令,裝好了以后我們就要棄用 setuptools话肖,轉(zhuǎn)投pip北秽。要安裝任何一個庫,你只要找到他的名字(不需要版本號)最筒,用 pip 安裝即可贺氓。譬如安裝django,那么輸入如下命令即可:

pip install django

其實之前easy_install跟pip效用是類似的床蜘,都是在官方的第三方庫索引PyPI查詢信息并進(jìn)行下載和安裝辙培。pip 的優(yōu)勢在于支持更高級的功能,譬如虛擬環(huán)境邢锯,安裝失敗不會殘留破損的庫扬蕊,更重要的是 pip 還可以進(jìn)行卸載。輸入下面命令就能卸載一個之前由 pip 進(jìn)行安裝的庫弹囚。繼續(xù)上面的例子厨相,現(xiàn)在要卸載 django:

pip uninstall django

這是 setuptools 所缺失的功能。需要額外說明的是大部分純 Python 的庫都能用這個方法在 Windows 下裝上鸥鹉,但是需要編譯 C 語言模塊的一般都不太可能成功蛮穿。遇到這種情況,在相應(yīng)的庫德站點上找找有沒有對應(yīng)的 Windows 安裝包毁渗。

用 virtualenv 構(gòu)建虛擬 Python 環(huán)境

如果你使用過 Python 做過 Web 開發(fā)践磅,或者你有需求在本機上安裝多個版本的 Python 來測試你的代碼能否跑再 2.5, 2.6, 2.7 各個版本上,或者你的不同項目依賴于一個第三方庫的不同版本灸异;再或者府适,有時候你就是想要一個沒有之前安裝過的亂七八糟的庫,一個干凈的 Python 環(huán)境肺樟。這種時候virtualenv就能幫上你的忙檐春。它能利用安裝好的 Python ,在同一臺機器上建立一個或多個互不相干的虛擬 Python 環(huán)境么伯,且能隨時切換疟暖。如果你看到這里還不覺得這個有什么用處,那不妨看下去留下點印象田柔,等哪天你有這類需求的時候能找到這個簡單實用的工具俐巴。

和其他第三方庫一樣,我們可以通過 pip 輕松安裝:

pip install virtualenv

安裝完成后你可以開啟一個命令行窗口硬爆,輸入virtualenv看看能不能找到這個腳本欣舵。如果有問題的話,請按照上面介紹過的步驟檢查下是否設(shè)置好了 PATH缀磕。之后我們可以在一個方便的地方建立一個虛擬環(huán)境缘圈。建立C:\envs\文件夾劣光,命令行下 cd 到該文件夾中,輸入:

virtualenv --no-site-packages --python=C:\Python26\python.exe envtest

之后應(yīng)該會看到一個叫envtest的文件夾糟把。這就是一個新建立的虛擬環(huán)境(virtual enviroment)赎线。我們不妨先激活它來看看應(yīng)該怎么用。命令行下執(zhí)行envtest\Scripts\activate.bat糊饱,這時是你會發(fā)現(xiàn)命令行變成這個樣子:

(envtest) c:\>

提示符前面的(envtest)就是該環(huán)境已被激活的標(biāo)志。這樣你就可以在這個虛擬環(huán)境下進(jìn)行工作了颠黎。執(zhí)行pip freeze另锋,你會發(fā)現(xiàn)... 你會發(fā)現(xiàn)什么都沒有啊。執(zhí)行pip help狭归,你可以看到pip freeze是輸出當(dāng)前 Python 環(huán)境下已經(jīng)安裝的所有第三方庫夭坪。因為我們創(chuàng)建此環(huán)境時開啟了選項--no-site-packages,意思就是在創(chuàng)建此虛擬環(huán)境中不從系統(tǒng) Python 中把已經(jīng)安裝了的庫也安裝到這里來过椎,所以這里是一個干凈的新 Python 環(huán)境室梅。你可以在這里調(diào)用pip或者easy_install來安裝各種你需要的庫到這個環(huán)境中來,而不會影響到你系統(tǒng)中 Python 的情況疚宇,所以說它是一個虛擬的Python 環(huán)境亡鼠。

我們再回頭看下envtest目錄的結(jié)構(gòu),其下面的Scripts目錄中有python.exepip.exe這些程序敷待,在虛擬環(huán)境已激活的情況下间涵,你調(diào)用python或者pip都是調(diào)用的此目錄中的程序。此時系統(tǒng)中的python.exe被 virtualenv 通過設(shè)置環(huán)境變量隱藏了起來榜揖。而Lib目錄下就是存放各種新安裝的庫勾哩。

到這里你應(yīng)該已經(jīng)對 virtualenv 基本操作已經(jīng)了解了,下面講些使用上的注意事項:

調(diào)用activate.bat開啟虛擬環(huán)境举哟,你也可以用同目錄下的deactivate.bat來退出該虛擬環(huán)境思劳。

建立虛擬環(huán)境時的參數(shù)--python=C:\Python26\python.exe是用來指定你想使用 Python 程序位置,所以你可以建立多個虛擬環(huán)境來指向多個 Python 版本妨猩。另外你要注意的是如果你在系統(tǒng)上安裝了多個版本的 Python潜叛, 你最先安裝的一個版本會被當(dāng)做主要版本,你在命令行下打python時册赛,調(diào)用的就是最先安裝的一個版本钠导。其實這個是按照 PATH 中設(shè)定的路徑位置來確定的,你最好把你需要主要使用的版本相關(guān)路徑放在 PATH 環(huán)境變量中最前面森瘪。比如我的機器上牡属,就是把C:\Python26和C:\Python26\Scripts作為 PATH 最前面兩個。這樣應(yīng)該就能讓保證你主要版本的正常使用扼睬。

當(dāng)你在一個虛擬環(huán)境下工作時逮栅,假如你想在當(dāng)前環(huán)境下來執(zhí)行一個 Python 程序悴势,這時你在命令行下必須執(zhí)行python foo.py,這樣 foo.py 才會在你當(dāng)前已經(jīng)激活的 virtualenv 下執(zhí)行措伐。作為比較如果你直接執(zhí)行foo.py那么它仍然時在系統(tǒng)環(huán)境下執(zhí)行的特纤。

另外,Linux 下可以使用virtualenvwrapper來進(jìn)行方便的管理和切換各個環(huán)境侥加,可惜的是這東西在 Windows 下用不了捧存。但幸好有一個簡單的腳本envdotpy來幫助你使用。把env.py放到 PATH 上的目錄內(nèi)担败,譬如C:\Python26\Scripts下昔穴。之后先打開里面的DEFAULT_DIR_PATH變量,把它改成你集中存放 virtualenv 的地方提前,在我們上面的例子中就可以把這行改為:

DEFAULT_DIR_PATH = "C:\\envs\\"

之后你就不需要專門 cd 到這個目錄吗货,而可以在任意路徑上通過env.py來進(jìn)行激活,切換狈网,退出 virtualenv 了宙搬。例如執(zhí)行:env.py envtest就能激活envtest。執(zhí)行env.py -q就能退出任意一個 virtualenv拓哺。

Winpdb 進(jìn)行可視化調(diào)試

如果你使用的PyDev的話那么用其自帶的斷點調(diào)試應(yīng)該就可以了勇垛。Winpdb則是為用其他簡單編輯器進(jìn)行 Python 開發(fā)的用戶提供一個熟悉的調(diào)試環(huán)境。Winpdb不出意料的也在 Python(x, y)當(dāng)中拓售。所以如果裝上 Python(x, y) 你可以不斷發(fā)掘里面附帶的優(yōu)秀工具窥摄。使用方法很簡單,假設(shè)程序名為 foo.py础淤,那么在命令行中輸入:

winpdb foo.py

之后會彈出窗口崭放,也就是一個大家都熟悉的 debug 圖形界面。需要注意的是這里需要點擊想要設(shè)置斷點的行鸽凶,點擊 F9 設(shè)置斷點币砂,然后該行底色會變?yōu)榧t色,如下圖所示玻侥。

編碼問題

作為中文用戶决摧,初學(xué) Python 最容易碰到的問題估計就是編碼問題了。明明英文的都可以用到中文的時候就要出問題凑兰,而且出錯信息難以理解掌桩,想要解決問題又不知道從何開始。幸運的是編碼問題通過預(yù)防性的措施是很好避免的姑食。下面從幾個方面來講講 Python 中處理中文及 Unicode 容易碰到的問題波岛。

Unicode 編碼基礎(chǔ)

這里非常簡單的講一下編碼知識,此部分表述可能不太準(zhǔn)確音半,如果你對 Unicode 更為了解的話請聯(lián)系我?guī)兔m正则拷。

你可以想象 Unicode 是一個很大的表贡蓖,里面有著世界上所有的文字的個體,如英文中的字母煌茬,中文的漢字斥铺。事實上 Unicode 標(biāo)準(zhǔn)中每一個字都有一個唯一對應(yīng)的編號,好比說 '中'字 對應(yīng)十六進(jìn)制 0x4E2D坛善,而字母 'a' 對應(yīng)的是十六進(jìn)制 0x0061晾蜘。這個編號是由Unicode Consortium這個組織來確定的。 如果說用這個編碼來對應(yīng)字符來用于表示字符眠屎,理論上是可以的笙纤,這樣的話就是每一個數(shù)字編號能對應(yīng)一個字符。

而實際情況中组力,不是每篇文章都用得到世界上所有的字符。譬如一篇英文文章就只有英文字母加上一些符號抖拴,用 Unicode 來進(jìn)行存儲的話每個字符要浪費太多的空間燎字。所以就有各種類型的編碼產(chǎn)生。編碼我們這里可以理解就是將一部分的 Unicode (比如說所有的中文阿宅,或者所有的日文)字符候衍,以某種方式確定另外一個符號來代表他。中文常用編碼有 UTF8 和 GBK洒放,仍然以 '中'字 為例蛉鹿, UTF8 編碼將對應(yīng) '中'字 的 Unicode 編號0x4E2D拆成三個的編號的組合,[0xE4, 0xB8, 0xAD]往湿,只有這幾個連在一起的時候才會被作為一個 '中'字 顯示出來妖异;作為對比,GBK 編碼將 '中'字 對應(yīng)的 Unicode 編號0x4E2D編碼成為兩個編號的組合[0xD6, 0xD0]领追,在 GBK 編碼環(huán)境下只有這兩個編號一起時他膳,才會顯示為 '中'字。

上面的例子中绒窑,如果把 UTF8 編碼后的[0xE4, 0xB8, 0xAD]放到 GBK 環(huán)境下來顯示會怎樣棕孙?這幾個編號跟 '中'字 在 GBK 下的編碼[0xD6, 0xD0],不同些膨,則顯然不會顯示為 '中'字蟀俊。這三個字符會跟排在其前后的字符一起,按照 GBK 的編碼規(guī)則找有沒有對應(yīng)的字符订雾。結(jié)果有可能顯示出一個毫不相關(guān)的字符肢预,有時候為符號或者干脆不顯示,這種情況就算產(chǎn)生了亂碼葬燎。

Python 2.x 中的 String 與 Unicode

在 Python 2.x 中是有兩種字串符相關(guān)類型的误甚,分別為 String 和 Unicode缚甩,兩者提供的接口非常類似,有時候又能自動轉(zhuǎn)換窑邦,蠻容易誤導(dǎo)人的擅威。在 Python 3 中 這兩個類型分別用 Bytes 和 String 替代了。這個名字更能說明兩者的本質(zhì):Python 2.x 中的String 中存儲的是沒有編碼信息的字節(jié)序列冈钦,也就是說 String 中存儲的是已經(jīng)編碼過后的序列郊丛,但他并不知道自身是用的哪種編碼。相反的Unicode 中存儲的是記載了編碼的字串信息瞧筛,其中存儲的就是相應(yīng)字符的 Unicode 編號厉熟。在這里用程序來說明,我們建立一個簡單的腳本名字為encoding.py较幌,代碼如下:

#!/usr/bin/python

# -*- coding: utf-8 -*-

strs = "這是中文"

unis = "這也是中文".decode("utf8")

print strs[0:2]

print unis[0:2].encode('gbk')

print len(strs)

print len(unis)

前面兩行后面會解釋到揍瑟,就是限定運行環(huán)境以及該腳本文件的編碼格式。此腳本在這里可以下載乍炉,如果你要自己寫的話請務(wù)必確保腳本的編碼是 utf8 而不是別的绢片。在 Windows 下的運行結(jié)果在這里,我覺得正好能說明問題:

C:\SHARED\Dev\scripts>encoding.py

這也

12

5

這里需要說明岛琼,我們的程序是 UTF8 編碼底循,主要意義是該程序中的所有直接寫出來的字串符(用"", ''括起來的字串符)是運用 UTF8 格式編碼的;然而 Windows 下的命令行是 GBK 環(huán)境槐瑞。這里strs是一個String熙涤。事實上在 Python 2.x 中直接寫在程序中的字串符,其類型都是String(這里不考慮 string literal)困檩。我們先直接輸出strs[0:2]祠挫,得到的是一個亂碼字符(這個字符只是碰巧湊成是一個字)。如上面說的悼沿,String中存儲的是沒有編碼信息的字串序列茸歧,這里就是將strs中前兩個編號取出并嘗試顯示。由于命令行環(huán)境為 GBK 編碼显沈,這里對應(yīng)的字碰巧湊成了一個字软瞎,但是跟原本的字沒有任何關(guān)系。

unis是由一個String調(diào)用decode()方法得到拉讯,這正是在 Python 2.x 中取得Unicode的最基本的方式涤浇。由于String并不知道它本身是由什么編碼格式來進(jìn)行的編碼,這里是我們的責(zé)任來確定他原來是用哪種編碼方式進(jìn)行編碼魔慷。我們知道代碼中的編碼格式是 UTF8只锭,所以我們可以用調(diào)用String的decode()方法來進(jìn)行反編碼,也就是解碼院尔, 把字串符從某種編碼后的格式轉(zhuǎn)換為其唯一對應(yīng)的 Unicode 編號蜻展。unis為解碼獲得的結(jié)果喉誊,其在 Python 2.x 中對應(yīng)類型就是Unicode,其中存儲的就是 每個字符對應(yīng)的 Unicode 編號纵顾。

我們嘗試輸出unis的前兩個字符伍茄,在這里我們調(diào)用了Unicode的encode()方法。這就是編碼的過程施逾。我們知道 Windows 命令行下的編碼是 GBK敷矫,只有采用 GBK 編碼的字符才能正確顯示。所以在這里我們通過調(diào)用Unicode的encode()方法汉额,將unis中存儲的 Unicode 編號 按照 GBK 的規(guī)則來進(jìn)行編碼曹仗,并輸出到屏幕上。這里我們看到這里正確的顯示了unis中的前兩個字符蠕搜。要注意的是在命令行中直接printUnicode的話 Python 會自動根據(jù)當(dāng)前環(huán)境進(jìn)行編碼后再顯示怎茫,但這樣掩蓋了兩者的區(qū)別。建議總是手動調(diào)用encode和decode方法妓灌,這樣自己也會清楚一些遭居。

后面兩者長度的差別也是佐證我們之前的例子。strs中存儲的是 UTF8 編碼后的編號序列旬渠,上面看到一個中文字符在 UTF8 編碼后變成三個連續(xù)的,所以strs長度為 3x4 = 12端壳。你可以想象strs中存放的并不是中文告丢,而是一系列沒有意義的比特序列;而unis中存儲的是對應(yīng)的中文的 Unicode 編碼损谦。我們知道每一個字符對應(yīng)一個編號岖免,所以五個字對應(yīng)五個編號,長度為 5照捡。

避免颅湘,和解決編碼產(chǎn)生的問題

了解了 Python Unicode 編碼解碼的這些概念后,我們來看看如何盡量的避免遇到讓人煩心的編碼問題栗精。

首先如果你的代碼中有中文闯参,那么一定要務(wù)必聲明代碼的編碼格式。根據(jù)PEP-0263中的介紹悲立,在程序的最開始加上以下兩行注釋就能確定編碼:

#!/usr/bin/python

# -*- coding: utf-8 -*-

其中utf-8就是指定的編碼格式鹿寨。事實上你應(yīng)該總是使用 UTF8 作為你 Python 程序的編碼格式,因為未來的 Python 3 所有文件都將默認(rèn)以 UTF8 編碼薪夕。另外除了聲明脚草,你必須確定你用來編輯 Python 程序的編輯器是不是真的以 UTF8 編碼來存儲文件。

之后就是養(yǎng)成關(guān)于編碼解碼的好習(xí)慣原献。當(dāng)你的程序有String作為輸入時馏慨,應(yīng)該盡早的將其轉(zhuǎn)換為Unicode埂淮,再在程序中進(jìn)行處理。再輸出的時候写隶,也要盡可能玩倔撞,直到最后輸出的時刻才將Unicode編碼為所需編碼格式的String進(jìn)行輸出。同樣的你必須保持你程序內(nèi)部所有參與運算的字串都是Unicode格式樟澜。很多著名的 Python 庫例如django就是采用的這種方式误窖,效果也蠻好。千萬不要依賴 Python 自己進(jìn)行兩者之間的轉(zhuǎn)換秩贰,也不要將String和Unicode放在一起運算霹俺,這些行為一方面十分容易引起錯誤,另一方面在 Python 3 中已經(jīng)無法再現(xiàn)毒费。

雖說確定String的編碼格式是程序員的責(zé)任丙唧,但有時候你真的不知道有些字串符到底是什么編碼的。這里有一個神奇chardet能夠幫助你觅玻。以下是摘自其頁面上的例子想际,很好了說明了它的作用:讀入任意一串字符,猜測其編碼格式溪厘,并且給出猜測的確信度胡本。

>>> import urllib

>>> urlread = lambda url: urllib.urlopen(url).read()

>>> import chardet

>>> chardet.detect(urlread("http://google.cn/"))

{'encoding': 'GB2312', 'confidence': 0.99}

>>> chardet.detect(urlread("http://yahoo.co.jp/"))

{'encoding': 'EUC-JP', 'confidence': 0.99}

>>> chardet.detect(urlread("http://amazon.co.jp/"))

{'encoding': 'SHIFT_JIS', 'confidence': 1}

>>> chardet.detect(urlread("http://pravda.ru/"))

{'encoding': 'windows-1251', 'confidence': 0.9355}

如果 confidence 非常低的話或者 chardet 直接報錯,多半是字串經(jīng)過多次錯誤編碼解碼畸悬,要從別的地方找辦法解決問題侧甫。

在處理包含漢字的文本文件時,一個很常見的問題就是有時候會碰到帶有 UTFBOM的文件蹋宦。這個簡單講就是文件頭幾個字節(jié)是用來表示文件是大端還是小端表示披粟。在實際中用的很少,而且會帶來很頭疼的問題冷冗。有時候你確定你有一個文件是 UTF8 編碼的守屉,但讀進(jìn)來頭幾個字節(jié)就出錯,那么十有八九就是這個的問題。Python 在讀取文件時仍然是所有字節(jié)順序讀進(jìn)來,不會透明的處理這個東西疤估。所以要么你可以用編輯器來把文件另存為無 BOM 的,要么在 Python 中做處理碰镜。在標(biāo)準(zhǔn)庫中有codec里面提供了相關(guān)功能:

import codecs

s = f.read(3)

if s == codecs.BOM_UTF8:

print "BOM detected"

這樣可以簡單檢測 BOM 是否存在,剩下的部分就要你自己發(fā)揮了习瑰。

如果上面的介紹還不能讓你理解 Unicode 的概念绪颖,這里還有幾篇關(guān)于這個問題的文章:

介紹 Unicode 的兩篇文章1,2。關(guān)于 Unicode 有更為詳細(xì)的解釋。

Unicode In Python, Completely Demystified特別針對 Python 下的 Unicode 處理進(jìn)行詳細(xì)的講解柠横。

其他

除了上面幾個重要的問題之外窃款,剩下的資源。

Vim Python開發(fā) 相關(guān)資源

事實上我現(xiàn)在自己是在用 Vim 寫 Python牍氛,感覺也蠻不錯晨继。以下是相關(guān)資源。

UltimateVimPythonSetup比較新的一個專門針對 Python 的 Vim 配置文件搬俊。

Vim as Python IDE只要搜 Python 和 Vim 就一定會找到這一篇文章紊扬。

vimcolorschemetest所有的Vim 配色方案都在集結(jié)在這里。

Python 相關(guān) Vim 插件

pythoncomplete.vim按上面的介紹配置一下唉擂,在自動輸入的時候按Ctrl-X, Ctrl-O就有很強力的自動補全了餐屎。

python.vim加強語法的高亮。

pyflakes.vim很棒的語法檢查玩祟,分析你的語法看避免低級錯誤腹缩。注意這個在Vim7.2下才有用, 如果是7.1則一點效果都沒有...

其他相關(guān)資源

用Python做科學(xué)計算

這個把Python(x,y)里面所有的模塊基本上都講了一遍空扎,我覺得外國人肯定都希望這個有個英文版的藏鹊。

PyMOTW

這個名字看起來像個Python庫(其實它還真的是一個...),但他總體來說其實是一份文檔转锈, "Python每周一個模塊"盘寡。作者持續(xù)幾年每周介紹一個Python標(biāo)準(zhǔn)庫中的庫。你可以把他看做是一個Python標(biāo)準(zhǔn)庫文檔的一個很棒的補充撮慨,當(dāng)你看標(biāo)準(zhǔn)庫中的介紹看的云里霧里的時候竿痰,不妨來這邊找找相應(yīng)的介紹。因為這里的例子給的很全甫煞,而且基本上你用的到的偏門的庫這里都有介紹哦。另外一個好消息是PyMOTW有一份很棒中文翻譯版冠绢。

reddit.com/r/pythonpython.org planet

Python 相關(guān)的文章和資源抚吠。就我個人經(jīng)歷來說,每次都能在這里看到很多有用的東西弟胀。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末楷力,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子孵户,更是在濱河造成了極大的恐慌萧朝,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件夏哭,死亡現(xiàn)場離奇詭異检柬,居然都是意外死亡,警方通過查閱死者的電腦和手機竖配,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門何址,熙熙樓的掌柜王于貴愁眉苦臉地迎上來里逆,“玉大人,你說我怎么就攤上這事用爪≡海” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵偎血,是天一觀的道長诸衔。 經(jīng)常有香客問我,道長颇玷,這世上最難降的妖魔是什么笨农? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮亚隙,結(jié)果婚禮上磁餐,老公的妹妹穿的比我還像新娘。我一直安慰自己阿弃,他們只是感情好诊霹,可當(dāng)我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著渣淳,像睡著了一般脾还。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上入愧,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天鄙漏,我揣著相機與錄音,去河邊找鬼棺蛛。 笑死怔蚌,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的旁赊。 我是一名探鬼主播桦踊,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼终畅!你這毒婦竟也來了籍胯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤离福,失蹤者是張志新(化名)和其女友劉穎杖狼,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體妖爷,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡蝶涩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片子寓。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡暗挑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出斜友,到底是詐尸還是另有隱情炸裆,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布鲜屏,位于F島的核電站烹看,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏洛史。R本人自食惡果不足惜惯殊,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望也殖。 院中可真熱鬧土思,春花似錦、人聲如沸忆嗜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捆毫。三九已至闪湾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間绩卤,已是汗流浹背途样。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留濒憋,地道東北人何暇。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像凛驮,于是被迫代替她去往敵國和親裆站。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容