成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

一篇文章入門Python生態(tài)系統(tǒng)

dadong / 1845人閱讀

摘要:你使用的系統(tǒng)自帶的包管理器包索引也被稱為各種源碼托管服務(wù),如,,等。通過系統(tǒng)自帶的包管理器安裝使用系統(tǒng)自帶的包管理器安裝,只需要在命令行輸入相應(yīng)命令,或是使用你用來安裝其他應(yīng)用的應(yīng)用即可。

譯者按:原文寫于2011年末,雖然文中關(guān)于Python 3的一些說法可以說已經(jīng)不成立了,但是作為一篇面向從其他語言轉(zhuǎn)型到Python的程序員來說,本文對Python的生態(tài)系統(tǒng)還是做了較為全面的介紹。文中提到了一些第三方庫,但是Python社區(qū)中強(qiáng)大的第三方庫并不止這些,歡迎各位Pytonistas補(bǔ)充。

原文鏈接:http://mirnazim.org/writings/python-ecosystem-introduction/
譯文鏈接:http://codingpy.com/article/python-ecosystem-introduction/

開發(fā)者從PHP、Ruby或其他語言轉(zhuǎn)到Python時(shí),最常碰到的第一個(gè)障礙,就是缺乏對Python生態(tài)系統(tǒng)的全面了解。開發(fā)者經(jīng)常希望能有一個(gè)教程或是資源,向他們介紹如何以大致標(biāo)準(zhǔn)的方式完成大部分的任務(wù)。

本文中的內(nèi)容,是對我所在公司內(nèi)部維基百科的摘錄,記錄了面向網(wǎng)絡(luò)應(yīng)用開發(fā)的Python生態(tài)系統(tǒng)基礎(chǔ)知識,目標(biāo)受眾則是公司實(shí)習(xí)生、培訓(xùn)人員以及從其他語言轉(zhuǎn)型到Python的資深開發(fā)者。

文中所列的內(nèi)容或資源是不完整的。我也打算把它當(dāng)成一項(xiàng)一直在進(jìn)行中的工作(work in perpetual progress)。希望經(jīng)過不斷的增補(bǔ)修訂,本文會成為Python生態(tài)系統(tǒng)方面的一篇詳盡教程。

目標(biāo)受眾

本文的目的,不是教大家Python編程語言。讀完這篇教程,你也不會瞬間變成一名Python高手。我假設(shè)大家已經(jīng)有一定的Python基礎(chǔ)。如果你是初學(xué)者,那么別再繼續(xù)讀下去了。先去看看Zed Shaw所寫的《笨辦法學(xué)Python》,這是本質(zhì)量很高的免費(fèi)電子書,看完之后再回頭閱讀這篇教程吧。

我假設(shè)你們使用的是Linux(最好是Ubuntu/Debian)或是類Linux操作系統(tǒng)。為什么?因?yàn)檫@是我最熟悉的系統(tǒng)。我在Windows平臺或Mac OS X平臺上,沒有專業(yè)的編程經(jīng)驗(yàn),只是測試過不同瀏覽器的兼容性。如果你用的是這兩個(gè)平臺,那么請參考下面的資料安裝Python。

Python 101: Setting up Python on Windows

Official documentation for Python on Windows

Official documentation for Python on Mac OS X

你還可使用搜索引擎,查找你使用的操作系統(tǒng)中安裝Python的最好方法。如果你有什么疑問,我強(qiáng)烈建議你去Stack Overflow平臺上提問。

該選擇哪個(gè)版本?

Python 2.x是目前的主流;Python 3是嶄新的未來。如果你不關(guān)心這個(gè)問題,可以直接跳到下面的Python安裝部分。(譯者注:原文作者寫這篇文章時(shí)是2011年,當(dāng)時(shí)Python 3才發(fā)展沒幾年。)

剛接觸Python的話,安裝3.x版本看上去是很自然的第一步,但是這可能并不是你想要的。

目前有兩個(gè)積極開發(fā)中的Python版本——2.7.x與3.x(也被稱為Python 3, Py3K和Python 3000)。Python 3是一個(gè)不同于Python 2的語言。二者在語義、語法上,既存在細(xì)微的區(qū)別,又有著截然不同的一面。截至今天,Python2.6/2.7是安裝數(shù)量和使用度最高的版本。許多主流的Python庫、框架、工具都沒有做到100%兼容Python 3。

因此,最穩(wěn)妥的選擇就是使用2.x版(更準(zhǔn)確的說,即2.7.x)。務(wù)必只在你需要或者完全了解情況的前提下,才選擇Python 3。

Python 3 Wall of Shame網(wǎng)站記錄了Python 3對各種庫的兼容情況。在使用Python 3之前,仔細(xì)查閱下這個(gè)網(wǎng)站的內(nèi)容。

譯者注:現(xiàn)在,主流第三方庫和框架對Python 3的支持度已經(jīng)很高。根據(jù)py3readiness網(wǎng)站的統(tǒng)計(jì),360個(gè)最受歡迎的Python包中已經(jīng)有315個(gè)支持Python 3。具體的支持情況,可以查看這個(gè)網(wǎng)站。一定程度上說,Python 3已經(jīng)成為新的主流。

使用哪種虛擬機(jī)

Python的解釋器,又叫做Python虛擬機(jī),它有多種不同的實(shí)現(xiàn)。其中,主流實(shí)現(xiàn)方式是CPython,裝機(jī)量也最高,同時(shí)也是其他虛擬機(jī)的參考實(shí)現(xiàn)。

PyPy是利用Python語言實(shí)現(xiàn)的Python;Jython則使用Java實(shí)現(xiàn),并運(yùn)行在Java虛擬機(jī)之上;IronPython是用.NET CLR實(shí)現(xiàn)的Python。

除非真的有重大理由,否則應(yīng)該選擇CPython版本的實(shí)現(xiàn),避免出現(xiàn)意外情況。

如果這些有關(guān)版本和虛擬機(jī)的嘮叨話讓你讀了頭疼,那你只需要使用CPython 2.7.x即可。

Python安裝

大部分Linux/Unix發(fā)行版和Mac OS X都預(yù)裝了Python。如果你沒有安裝或者已有的版本比較舊,那么你可以通過下面的命令安裝2.7.x版:

Ubuntu/Debian及其衍生系統(tǒng)

$ sudo apt-get install python2.7

sudo是類Unix系統(tǒng)中的一個(gè)程序,可以讓用戶以其他用戶的權(quán)限(通常是超級用戶或root用戶)運(yùn)行程序。

Fedora/Red Hat及類似系統(tǒng)

sudo yum install python2.7

在RHEL(Red Hat Enterprise Linux的縮寫)平臺上,你可能需要啟用EPEL軟件源(repositories),才能正常安裝。

在本文后面的示例中,我會使用sudo程序;你應(yīng)將其替換為自己版本中的相應(yīng)命令或程序。

理解Python的包(package)

首先你需要了解的是,Python沒有默認(rèn)的包管理工具。事實(shí)上,Python語言中包的概念,也是十分松散的。

你可能也知道,Python代碼按照模塊(module)劃分。一個(gè)模塊,可以是只有一個(gè)函數(shù)的單個(gè)文件,也可以是包含一個(gè)或多個(gè)子模塊的文件夾。包與模塊之間的區(qū)別非常小,每個(gè)模塊同時(shí)也可以視作一個(gè)包。

那么模塊與包之間,到底有什么區(qū)別?要想解答這個(gè)問題,你首先要了解Python是如何查找模塊的。

與其他編程環(huán)境類似,Python中也有一些函數(shù)和類(比如str,lenException)是存在于全局作用域(global scope,在Python中被稱為builtin scope)的,其他的函數(shù)和類則需要通過import語句進(jìn)行引用。例如:

>>> import os
>>> from os.path import basename, dirname

這些包就在你的文件系統(tǒng)中的某處,所以能被import語句發(fā)現(xiàn)。那么Python是怎么知道這些模塊的地址?原來,在你安裝Python虛擬機(jī)的時(shí)候,就自動設(shè)置了這些地址。當(dāng)然平臺不同,這些地址也就不一樣。

你可以通過sys.path查看系統(tǒng)中的包路徑。這是我的筆記本運(yùn)行該命令之后的輸出結(jié)果,系統(tǒng)是Ubuntu 11.10 Oneric Ocelot。

>>> import sys
>>> print sys.path
["",
 "/usr/lib/python2.7",
 "/usr/lib/python2.7/plat-linux2",
 "/usr/lib/python2.7/lib-tk",
 "/usr/lib/python2.7/lib-old",
 "/usr/lib/python2.7/lib-dynload",
 "/usr/local/lib/python2.7/dist-packages",
 "/usr/lib/python2.7/dist-packages",
 "/usr/lib/python2.7/dist-packages/PIL",
 "/usr/lib/python2.7/dist-packages/gst-0.10",
 "/usr/lib/python2.7/dist-packages/gtk-2.0",
 "/usr/lib/pymodules/python2.7",
 "/usr/lib/python2.7/dist-packages/ubuntu-sso-client",
 "/usr/lib/python2.7/dist-packages/ubuntuone-client",
 "/usr/lib/python2.7/dist-packages/ubuntuone-control-panel",
 "/usr/lib/python2.7/dist-packages/ubuntuone-couch",
 "/usr/lib/python2.7/dist-packages/ubuntuone-installer",
 "/usr/lib/python2.7/dist-packages/ubuntuone-storage-protocol"]

這行代碼會告訴你Python搜索指定包的所有路徑,這個(gè)路徑就存儲在一個(gè)Python列表數(shù)據(jù)類型中。它會先從第一個(gè)路徑開始,一直往下檢索,直到找到匹配的路徑名。這意味著,如果兩個(gè)不同的文件夾中包含了兩個(gè)同名的包,那么包檢索將會返回其遇到的第一個(gè)絕對匹配地址,不會再繼續(xù)檢索下去。

你現(xiàn)在可能也猜到了,我們可以輕松地修改(hack)包檢索路徑,做到你指定的包第一個(gè)被發(fā)現(xiàn)。你只需要運(yùn)行下面的代碼:

>>> sys.path.insert(0, "/path/to/my/packages")

盡管這種做法在很多情況下十分有用,但是你必須牢記sys.path很容易被濫用。務(wù)必在必要時(shí)才使用這種方法,并且不要濫用。

site模塊控制著包檢索路徑設(shè)置的方法。每次Python虛擬機(jī)初始化時(shí),就會被自動引用。如果你想更詳細(xì)地了解整個(gè)過程,可以查閱官方文檔。

PYTHONPATH環(huán)境變量

PYTHONPATH是一個(gè)可以用來增強(qiáng)默認(rèn)包檢索路徑的環(huán)境變量??梢园阉醋魇且粋€(gè)PATH變量,但是一個(gè)只針對Python的變量。它只是一些包含有Python模塊的文件路徑列表(不是sys.path所返回的Python列表),每個(gè)路徑之間以:分隔。設(shè)置方法很簡單,如下:

export PYTHONPATH=/path/to/some/directory:/path/to/another/directory:/path/to/yet/another/directory

在某些情況下,你不用覆蓋已有的PYTHONPATH,只需要在開頭或結(jié)尾加上新的路徑即可。

export PYTHONPATH=$PYTHONPATH:/path/to/some/directory    # Append
export PYTHONPATH=/path/to/some/directory:$PYTHONPATH    # Prepend

PYTHONPATH、sys.path.insert`和其他類似的方法,都是hack小技巧,一般情況下最好不要使用。如果它們能夠解決本地開發(fā)環(huán)境出現(xiàn)的問題,可以使用,但是你的生產(chǎn)環(huán)境中不應(yīng)該依賴這些技巧。要取得同樣的效果,我們還可以找到更加優(yōu)雅的方法,稍后我會詳細(xì)介紹。

現(xiàn)在你明白了Python如何查找已安裝的包,我們就可以回到一開始的那個(gè)問題了。Python中,模塊和包的區(qū)別到底是什么?包就是一個(gè)或多個(gè)模塊/子模塊的集合,一般都是以經(jīng)過壓縮的tarball文件形式傳輸,這個(gè)文件中包含了:1. 依賴情況(如果有的話);2.將文件復(fù)制到標(biāo)準(zhǔn)的包檢索路徑的說明;3. 編譯說明——如果文件中包含了必須要經(jīng)過編譯才能安裝的代碼。就是這點(diǎn)區(qū)別。

第三方包(Third Party packages)

如果想利用Python進(jìn)行真正的編程工作,你從一開始就需要根據(jù)不同的任務(wù)安裝第三方包。

在Linux系統(tǒng)上,至少有3種安裝第三方包的方法。

使用系統(tǒng)本身自帶的包管理器(deb, rpm等)

通過社區(qū)開發(fā)的類似pip, easy_install等多種工具

從源文件安裝

這三種方法做的幾乎是同一件事情,即安裝依賴包,視情況編譯代碼,然后把包中模塊復(fù)制到標(biāo)準(zhǔn)包檢索路徑。

盡管第二種和第三種方法在所有操作系統(tǒng)中的實(shí)現(xiàn)都一致,我還是要再次建議你查閱Stack Overflow網(wǎng)站的問答,找到你所使用系統(tǒng)中其他安裝第三方包的方法。

去哪找第三方包?

在安裝第三方包之前,你得先找到它們。查找包的方法有很多。

你使用的系統(tǒng)自帶的包管理器

Python包索引(也被稱為PyPI)

各種源碼托管服務(wù),如Launchpad, Github, Bitbucket等。

通過系統(tǒng)自帶的包管理器安裝

使用系統(tǒng)自帶的包管理器安裝,只需要在命令行輸入相應(yīng)命令,或是使用你用來安裝其他應(yīng)用的GUI應(yīng)用即可。舉個(gè)例子,要在Ubuntu系統(tǒng)上安裝simplejson(一個(gè)JSON解析工具),你可以輸入下面的命令:

$ sudo apt-get install python-simplejson
通過pip安裝

easy_install已經(jīng)不太受開發(fā)者歡迎。本文將重點(diǎn)介紹easy_install的替代者——pip。

pip是一個(gè)用來安裝和管理Python包的工具。它并不是一個(gè)Python虛擬機(jī)自帶的模塊,所以我們需要先安裝。在Linux系統(tǒng)中,我一般會這樣操作:

$ sudo apt-get install python-pip

在安裝其他包之前,我總是會把pip升級到PyPI中的最新版本,因?yàn)閁buntu默認(rèn)源中的版本比PyPI的低。我這樣升級pip。

$ sudo pip install pip --upgrade

現(xiàn)在,你可以通過運(yùn)行run pip install package-name,安裝任何Python包。所以,要安裝simplejson的話,你可以運(yùn)行以下命令:

$ sudo pip install simplejson

移除包也一樣簡單。

$ sudo pip uninstall simplejson

pip默認(rèn)會安裝PyPI上最新的穩(wěn)定版,但是很多時(shí)候,你會希望安裝指定版本的包,因?yàn)槟愕捻?xiàng)目依賴那個(gè)特定的版本。要想指定包的版本,你可以這樣做:

$ sudo pip install simplejson==2.2.1

你還會經(jīng)常需要升級、降級或者重裝一些包。你可以通過下面的命令實(shí)現(xiàn):

$ sudo pip install simplejson --upgrade         # Upgrade a package to the latest version from PyPI
$ sudo pip install simplejson==2.2.1 --upgrade  # Upgrade/downgrade a package to a given version

接下來,假設(shè)你想安裝某個(gè)包的開發(fā)版本,但是代碼沒有放在PyPI上,而是在版本控制倉庫中,你該怎么辦?pip也可以滿足這個(gè)需求,但是在此之前,你需要在系統(tǒng)上安裝相應(yīng)的版本控制系統(tǒng)(VCS)。在Ubuntu平臺,你可以輸入下面的命令:

$ sudo apt-get install git-core mercurial subversion

安裝好VCS之后,你可以通過下面的方式從遠(yuǎn)程倉庫中安裝一個(gè)包:

$ sudo pip install git+http://hostname_or_ip/path/to/git-repo#egg=packagename
$ sudo pip install hg+http://hostname_or_ip/path/to/hg-repo#egg=packagename
$ sudo pip install svn+http://hostname_or_ip/path/to/svn-repo#egg=packagename

從本地倉庫中安裝也同樣簡單。注意下面文件系統(tǒng)路徑部分的三個(gè)斜杠(///)。

$ sudo pip install git+file:///path/to/local/repository

通過git協(xié)議安裝時(shí),請注意,你要像下面這樣使用git+git前綴:

$ sudo pip install git+git://hostname_or_ip/path/to/git-repo#egg=packagename

現(xiàn)在,你可能在納悶這些命令中的eggs是什么東西?目前你只需要知道,一個(gè)egg就是經(jīng)zip壓縮之后的Python包,其中包含了包的源代碼和一些元數(shù)據(jù)。pip在安裝某個(gè)包之前,會構(gòu)建相關(guān)的egg信息。你可以打開代碼倉庫中的setup.py文件,查看egg的名字(幾乎都會注明)。找到setup部分,然后看看有沒有一行類似name="something"的代碼。你找到的代碼可能會和下面這段代碼類似(來自simplejson包中的setup.py文件)。

setup(
    name="simplejson", # <--- This is your egg name
    version=VERSION,
    description=DESCRIPTION,
    long_description=LONG_DESCRIPTION,
    classifiers=CLASSIFIERS,
    author="Bob Ippolito",
    author_email="[email protected]",
    url="http://github.com/simplejson/simplejson",
    license="MIT License",
    packages=["simplejson", "simplejson.tests"],
    platforms=["any"],
    **kw)

假如沒有setup.py文件呢?你該怎么查找egg的名字?答案是,你根本不用去找。只要把包的源代碼拷貝到你的項(xiàng)目文件夾,之后就可以和你自己寫的代碼一樣引用和使用啦。

--user參數(shù)

以上所有的例子,都是在系統(tǒng)層面安裝指定的包。如果你使用pip install時(shí),加上--user這個(gè)參數(shù),這些包將會安裝在該用戶的"~/.local`文件夾之下。例如,在我的機(jī)器上,運(yùn)行效果是這樣的:

$ pip install --user markdown2
Downloading/unpacking markdown2
  Downloading markdown2-1.0.1.19.zip (130Kb): 130Kb downloaded
  Running setup.py egg_info for package markdown2

Installing collected packages: markdown2
  Running setup.py install for markdown2
    warning: build_py: byte-compiling is disabled, skipping.

    changing mode of build/scripts-2.7/markdown2 from 664 to 775
    warning: install_lib: byte-compiling is disabled, skipping.
    changing mode of /home/mir/.local/bin/markdown2 to 775
Successfully installed markdown2
Cleaning up...

注意markdown2這個(gè)Python包的安裝路徑(/home/mir/.local/bin/markdown2

不在系統(tǒng)層面安裝所有的Python包有很多理由。稍后在介紹如何為每個(gè)項(xiàng)目設(shè)置多帶帶、孤立的Python環(huán)境時(shí),我會具體說明。

從源文件安裝

從源文件安裝Python包,只需要一行命令。將包文件解壓,然后運(yùn)行下面的命令:

cd /path/to/package/directory
python setup.py install

盡管這種安裝方法與其他的方法沒什么區(qū)別,但是要記?。?b>pip永遠(yuǎn)是安裝Python包的推薦方法,因?yàn)?b>pip可以讓你輕松升級/降級,不需要額外手動下載、解壓和安裝。從源文件安裝時(shí)如果其他方法都行不通時(shí),你的最后選擇(一般不會存在這種情況)。

安裝需要編譯的包

雖然我們已經(jīng)介紹了大部分與包安裝相關(guān)的內(nèi)容,仍有一點(diǎn)我們沒有涉及:含有C/C++代碼的Python包在安裝、使用之前,需要先編譯。最明顯的例子就是數(shù)據(jù)庫適配器(database adapters)、圖像處理庫等。

盡管pip可以管理源文件的編譯,我個(gè)人更喜歡通過系統(tǒng)自帶的包管理器安裝這類包。這樣安裝的就是預(yù)編譯好的二進(jìn)制文件。

如果你仍想(或需要)通過pip安裝,在Ubuntu系統(tǒng)下你需要執(zhí)行下面的操作。

安裝編譯器及相關(guān)工具:

$ sudo apt-get install build-essential

安裝Python開發(fā)文件(頭文件等):

$ sudo aptitude install python-dev-all

如果你的系統(tǒng)發(fā)行版本中沒有提供python-dev-all,請查找名字類似python-dev、python2.X-dev的相關(guān)包。

假設(shè)你要安裝psycopg2(PostgreSQL數(shù)據(jù)庫的Python適配器),你需要安裝PostgreSQL的開發(fā)文件。

$ sudo aptitude install  postgresql-server-dev-all

滿足這些依賴條件之后 ,你就可以通過pip install安裝了。

$ sudo pip install psycopg2

這里應(yīng)該記住一點(diǎn):并非所有這類包都兼容pip安裝方式。但是,如果你自信可以成功編譯源文件,并且(或者)已經(jīng)有目標(biāo)平臺上的必要經(jīng)驗(yàn)和知識,那么你完全可以按照這種方式安裝。

開發(fā)環(huán)境

不同的人設(shè)置開發(fā)環(huán)境的方法也不同,但是在幾乎所有的編程社區(qū)中,肯定有一種方法(或者超過一種)比其他方法的接受度更高。盡管開發(fā)環(huán)境設(shè)置的與別人不同沒有問題,一般來說接受度更高的方法經(jīng)受住了高強(qiáng)度的測試,并被證實(shí)可以簡化一些日常工作的重復(fù)性任務(wù),并且可以提高可維護(hù)性。

virtualenv

Python社區(qū)中設(shè)置開發(fā)環(huán)境的最受歡迎的方法,是通過virtualenv。Virtualenv是一個(gè)用于創(chuàng)建孤立Python環(huán)境的工具。那么現(xiàn)在問題來了:為什么我們需要孤立的Python環(huán)境?要回答這個(gè)問題,請?jiān)试S我引用virtualenv的官方文檔。

我們要解決的問題之一,就是依賴包和版本的管理問題,以及間接地解決權(quán)限問題。假設(shè)你有一個(gè)應(yīng)用需要使用LibFoo V1,但是另一個(gè)應(yīng)用需要V2。那么你如何使用兩個(gè)應(yīng)用呢?如果你把需要的包都安裝在/usr/lib/python2.7/site-packages(或是你的系統(tǒng)默認(rèn)路徑),很容易就出現(xiàn)你不小心更新了不應(yīng)該更新的應(yīng)用。

簡單來說,你的每一個(gè)項(xiàng)目都可以擁有一個(gè)多帶帶的、孤立的Python環(huán)境;你可以把所需的包安裝到各自孤立的環(huán)境中。

還是通過pip安裝virutalenv。

$ sudo pip install virtualenv

安裝完之后,運(yùn)行下面的命令,為你的項(xiàng)目創(chuàng)建孤立的Python環(huán)境。

$ mkdir my_project_venv
$ virtualenv --distribute my_project_venv
# The output will something like:
New python executable in my_project_venv/bin/python
Installing distribute.............................................done.
Installing pip.....................done.

那么這行代碼都做了些什么呢?你創(chuàng)建了一個(gè)名叫my_project_venv的文件夾,用于存儲新的Python環(huán)境。--distribute參數(shù)告訴virtualenv使用基于distribute包開發(fā)的新的、更好的打包系統(tǒng),而不是基于setuptools的舊系統(tǒng)。你現(xiàn)在只需要知道,--distribute參數(shù)將會自動在虛擬環(huán)境中安裝pip,免去了手動安裝的麻煩。隨著你的Python編程經(jīng)驗(yàn)和知識增加,你會慢慢明白這個(gè)過程的具體細(xì)節(jié)。

現(xiàn)在查看my_project_venv文件夾中的內(nèi)容,你會看到類似下面的文件夾結(jié)構(gòu):

# Showing only files/directories relevant to the discussion at hand
.
|-- bin
|   |-- activate  # <-- Activates this virtualenv
|   |-- pip       # <-- pip specific to this virtualenv
|   `-- python    # <-- A copy of python interpreter
`-- lib
    `-- python2.7 # <-- This is where all new packages will go

通過下面的命令,激活虛擬環(huán)境:

$ cd my_project_venv
$ source bin/activate

使用source命令啟動activate腳本之后,你的命令行提示符應(yīng)該會變成這樣:

:::bash 
(my_project_venv)$ 

虛擬環(huán)境的名稱會添加在$提示符的前面。

現(xiàn)在運(yùn)行下面的命令,關(guān)閉虛擬環(huán)境:

:::bash 
(my_project_venv)$ deactivate

當(dāng)你在系統(tǒng)層面安裝virtualenv時(shí)(如果激活了虛擬環(huán)境,請先關(guān)閉),可以運(yùn)行下面的命令幫助自己理解。

首先,我們來看看如果我們在終端輸入python或者pip,系統(tǒng)會使用哪個(gè)執(zhí)行文件。

$ which python
/usr/bin/python
$ which pip
/usr/local/bin/pip

現(xiàn)在再操作一次,但是首先要激活virtualenv,注意輸出結(jié)果的變化。在我的機(jī)器上,命令的輸出結(jié)果時(shí)這樣的:

$ cd my_project_venv
$ source bin/activate
(my_project_venv)$ which python
/home/mir/my_project_venv/bin/python
(my_project_venv)$ which pip
/home/mir/my_project_venv/bin/pip

virtualenv所做的,就是拷貝了一份Python可執(zhí)行文件,然后創(chuàng)建了一些功能腳本以及你在項(xiàng)目開發(fā)期間用于安裝、升級、刪除相關(guān)包的文件夾路徑。它還施展了一些包檢索路徑/PYTHONPATH魔法,確保實(shí)現(xiàn)以下幾點(diǎn):1. 在你安裝第三方包時(shí),它們被安裝在了當(dāng)前激活的虛擬環(huán)境,而不是系統(tǒng)環(huán)境中;2. 當(dāng)在代碼中引用第三方包時(shí),當(dāng)前激活的虛擬環(huán)境中的包將優(yōu)先于系統(tǒng)環(huán)境中的包。

這里有很重要的一點(diǎn)要注意:系統(tǒng)Python環(huán)境中安裝的所有包,默認(rèn)是可以在虛擬環(huán)境中調(diào)用的。這意味著,如果你在系統(tǒng)環(huán)境中安裝了simplejson包,那么所有的虛擬環(huán)境將自動獲得這個(gè)包的地址。你可以在創(chuàng)建虛擬環(huán)境時(shí),通過添加--no-site-packages選項(xiàng),取消這個(gè)行為,就像這樣:

$ virtualenv my_project_venv --no-site-packages
virtualenvwrapper

virtualenvwrappervirtualenv的封裝器(wrapper),提供了一些非常好的功能,便捷了創(chuàng)建、激活、管理和銷毀虛擬環(huán)境的操作,否則將會是件瑣事。你可以運(yùn)行如下命令安裝virtualenvwrapper

$ sudo pip install virtualenvwrapper

安裝結(jié)束之后,你需要進(jìn)行一些配置。下面是我的配置:

if [ `id -u` != "0" ]; then
  export VIRTUALENV_USE_DISTRIBUTE=1        # <-- Always use pip/distribute
  export WORKON_HOME=$HOME/.virtualenvs       # <-- Where all virtualenvs will be stored
  source /usr/local/bin/virtualenvwrapper.sh
  export PIP_VIRTUALENV_BASE=$WORKON_HOME
  export PIP_RESPECT_VIRTUALENV=true

這些配置中,唯一必須的是WORKON_HOMEsource /usr/local/bin/virtualenvwrapper.sh。其他的配置則是根據(jù)我的個(gè)人偏好進(jìn)行的。

將上面的配置添加到~/.bashrc文件的最后,然后在你當(dāng)前打開的終端界面中運(yùn)行下面的命令:

$ source ~/.bashrc

關(guān)掉所有打開的終端窗口和Tab窗口,也能取得同樣地效果。當(dāng)你再次打開終端窗口或Tab窗口時(shí),~/.bashrc將會被執(zhí)行,自動設(shè)置好你的virtualenvwrapper。

現(xiàn)在如果想創(chuàng)建、激活、關(guān)閉或是刪除虛擬環(huán)境,你可以運(yùn)行下面的代碼:

$ mkvirtualenv my_project_venv
$ workon my_project_venv
$ deactivate
$ rmvirtualenv my_project_venv

virtualenvwrapper還支持tab自動補(bǔ)全功能。

你可以前往virtualenvwrapper項(xiàng)目主頁查看更多命令和配置選項(xiàng)。

通過pip和virtualenv進(jìn)行基本的依賴包管理

pipvirtualenv結(jié)合使用,可以為項(xiàng)目提供基本的依賴包管理功能。

你可以使用pip freeze導(dǎo)出目前安裝的包列表。例如,下面就是我用來開發(fā)這個(gè)博客網(wǎng)站所用的Python包:

$ pip freeze -l 
Jinja2==2.6
PyYAML==3.10
Pygments==1.4
distribute==0.6.19
markdown2==1.0.1.19

注意,我使用了-l選項(xiàng)。它告訴pip只導(dǎo)出當(dāng)前激活的虛擬環(huán)境中安裝的包,忽略全局安裝的包。

你可以將導(dǎo)出的列表保存至文件,并把文件添加到版本控制系統(tǒng)(VCS)。

$ pip freeze -l  > requirements.txt

通過pip,我們可以從寫入了pip freeze命令結(jié)果的文件中,安裝相應(yīng)的包。

其他重要工具

前面我們介紹了有關(guān)Python版本、虛擬機(jī)和包管理的基礎(chǔ)知識,但是日常工作中還有其他任務(wù)需要使用專門的工具來完成。雖然我無法詳細(xì)介紹每一個(gè)工具,我會盡量做一個(gè)大概的介紹。

提前說聲對不起,因?yàn)橄旅娼榻B的大部分工具都是與網(wǎng)絡(luò)應(yīng)用開發(fā)相關(guān)的。

編輯器

提供在Python中進(jìn)行編程的優(yōu)秀編輯器有很多。我個(gè)人傾向于Vim,但是我不想引發(fā)一場編輯器優(yōu)劣大戰(zhàn)

對Python編程支持較好地編輯器和集成開發(fā)環(huán)境(IDEs),主要有Vim/GVim, Emacs, GNOME主題下的GEdit, Komodo Edit, Wing IDE, PyCharm等。還有其他編輯器,但是上面列舉的這些應(yīng)該是最受歡迎的。你應(yīng)該選擇最適合自己的工具。

Pyflakes:源碼檢查

Pyflakes是一個(gè)簡單的程序,通過分析文件的文本內(nèi)容,檢查Python源文件中的錯(cuò)誤。它可以檢查語法和部分邏輯錯(cuò)誤,識別被引用但沒有使用的模塊,以及只使用了一次的變量,等等。

你可以通過pip安裝:

$ pip install pyflakes

然后像下面那樣,在命令行調(diào)用pyflakes,傳入Python源文件作為參數(shù):

$ pyflakes filename.py

Pyflakes還可以嵌入到你的編輯器中。下面這張圖顯示的是嵌入了Vim之后的情況。注意出現(xiàn)了紅色的波浪線。

你可以在Stack Overflow上咨詢?nèi)绾卧谀闶褂玫木庉嬈髦靥砑覲yflakes支持。

Requests:為人類開發(fā)的HTTP庫

Requests庫讓你輕輕松松使用HTTP協(xié)議。

首先通過pip安裝:

$ pip install requests

下面是一個(gè)簡單的使用示例:

>>> import requests
>>> r = requests.get("https://api.github.com", auth=("user", "pass"))
>>> r.status_code
204
>>> r.headers["content-type"]
"application/json"
>>> r.content
...

更多詳情,請查看Requests的文檔。

Flask:網(wǎng)絡(luò)開發(fā)微框架

Flask是一個(gè)基于Werkzeug與Jinja2這兩個(gè)庫的Python微框架。

首先通過pip安裝:

$ pip install Flask

下面是一個(gè)簡單的使用示例:

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run()

這樣運(yùn)行Flask應(yīng)用:

$ python hello.py

Running on http://localhost:5000/

Flask官網(wǎng)

Django:面向網(wǎng)絡(luò)開發(fā)的全棧框架

Django是一個(gè)全棧網(wǎng)絡(luò)框架。它提供了ORM、HTTP庫、表格處理、XSS過濾、模板引擎以及其他功能。

這樣通過pip安裝:

$ pip install Django

前往Django官網(wǎng),跟著教程學(xué)習(xí)即可。非常簡單。

Fabric:簡化使用SSH部署網(wǎng)站和執(zhí)行系統(tǒng)管理任務(wù)的方式

Fabric是一個(gè)命令行工具,可以簡化使用SSH進(jìn)行網(wǎng)站部署或執(zhí)行系統(tǒng)管理任務(wù)的過程。

它提供了一套基本的操作,可以執(zhí)行本地或遠(yuǎn)程命令行命令,上傳/下載文件,以及提示用戶進(jìn)行輸入或者取消執(zhí)行等輔助性功能。

你可以通過pip安裝:

$ pip install fabric

下面是用Fabric寫的一個(gè)簡單任務(wù):

from fabric.api import run

def host_type():
    run("uname -s

接下來,你可以在一個(gè)或多個(gè)服務(wù)器上執(zhí)行該任務(wù):

$ fab -H localhost host_type
[localhost] run: uname -s
[localhost] out: Linux

Done.
Disconnecting from localhost... done.

Fabric官網(wǎng)

SciPy:Python中的科學(xué)計(jì)算工具

如果你的工作涉及科學(xué)計(jì)算或數(shù)學(xué)計(jì)算,那么SciPy就是必不可少的工具。

SciPy (pronounced "Sigh Pie") 是一個(gè)開源的數(shù)學(xué)、科學(xué)和工程計(jì)算包。SciPy包含的模塊有最優(yōu)化、線性代數(shù)、積分、插值、特殊函數(shù)、快速傅里葉變換、信號處理和圖像處理、常微分方程求解和其他科學(xué)與工程中常用的計(jì)算。與其功能相類似的軟件還有MATLAB、GNU Octave和Scilab。SciPy目前在BSD許可證下發(fā)布。它的開發(fā)由Enthought資助

前往SciPy官網(wǎng),獲取詳細(xì)的下載/安裝說明以及文檔。

PEP 8:Python風(fēng)格指南

雖然PEP 8本身不是一個(gè)工具,但毋庸置疑的是,它是Python開發(fā)方面一個(gè)非常重要的文件。

PEP 8這個(gè)文件中,定義了主流Python發(fā)行版本中標(biāo)準(zhǔn)庫的編碼規(guī)范。文件的唯一目的,就是確保其他的Python代碼都能遵守同樣地代碼結(jié)構(gòu)以及變量、類和函數(shù)命名規(guī)律。確保你充分了解并遵循該風(fēng)格指南。

PEP 8鏈接

強(qiáng)大的Python標(biāo)準(zhǔn)庫

Python的標(biāo)準(zhǔn)庫內(nèi)容非常豐富,提供了大量的功能。標(biāo)準(zhǔn)庫中包含了眾多內(nèi)建模塊(built-in modules,用C語言編寫的),可以訪問類似文件讀/寫(I/O)這樣的系統(tǒng)功能,還包括了用Python編寫的模塊,提供了日常編程中許多問題的標(biāo)準(zhǔn)解決方案。其中一些模塊的設(shè)計(jì)思路很明顯,就是要鼓勵(lì)和增強(qiáng)Python程序的可移植性,因此將平臺相關(guān)的細(xì)節(jié)抽象為了不依賴于平臺的API接口。

查看標(biāo)準(zhǔn)庫的官方文檔。

推薦閱讀

David Goodger的《如何像Python高手一樣編程》一文,深入介紹了許多Python的慣用法和技巧,可以立刻為你增添許多有用的工具。

Doug Hellmann的系列文章Python Module of the Week。這個(gè)系列的焦點(diǎn),是為Python標(biāo)準(zhǔn)庫中模塊編寫示例代碼。

結(jié)語

我在本文中所介紹的內(nèi)容,觸及的還只是Python生態(tài)系統(tǒng)的表面。Python世界中,幾乎針對每一個(gè)你能想象到的任務(wù),都存在相關(guān)的工具、庫和軟件。這些明顯無法在一篇文章中盡述。你必須要自己慢慢探索。

Python有偉大的社區(qū),社區(qū)中的人很聰明,也很有耐心,樂于幫助Python語言的初學(xué)者。所以,你可以選擇一個(gè)最喜歡的開源項(xiàng)目,去它的IRC頻道找人聊天;關(guān)注郵件列表,并積極提問;和有豐富Python系統(tǒng)實(shí)施經(jīng)驗(yàn)的人交談。慢慢地,隨著你的經(jīng)驗(yàn)和知識逐步積累,你也會成為他們之中的一員。

最后,我為大家推薦Python之禪。反復(fù)回味、思考這幾段話,你一定會有所啟發(fā)!

>>> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren"t special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you"re Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it"s a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let"s do more of those!

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/44200.html

相關(guān)文章

  • SegmentFault 技術(shù)周刊 Vol.40 - 2018,來學(xué)習(xí)門新的編程語言吧!

    摘要:入門,第一個(gè)這是一門很新的語言,年前后正式公布,算起來是比較年輕的編程語言了,更重要的是它是面向程序員的函數(shù)式編程語言,它的代碼運(yùn)行在之上。它通過編輯類工具,帶來了先進(jìn)的編輯體驗(yàn),增強(qiáng)了語言服務(wù)。 showImg(https://segmentfault.com/img/bV1xdq?w=900&h=385); 新的一年不知不覺已經(jīng)到來了,總結(jié)過去的 2017,相信小伙們一定有很多收獲...

    caspar 評論0 收藏0
  • SegmentFault 技術(shù)周刊 Vol.40 - 2018,來學(xué)習(xí)門新的編程語言吧!

    摘要:入門,第一個(gè)這是一門很新的語言,年前后正式公布,算起來是比較年輕的編程語言了,更重要的是它是面向程序員的函數(shù)式編程語言,它的代碼運(yùn)行在之上。它通過編輯類工具,帶來了先進(jìn)的編輯體驗(yàn),增強(qiáng)了語言服務(wù)。 showImg(https://segmentfault.com/img/bV1xdq?w=900&h=385); 新的一年不知不覺已經(jīng)到來了,總結(jié)過去的 2017,相信小伙們一定有很多收獲...

    nihao 評論0 收藏0
  • SegmentFault 技術(shù)周刊 Vol.40 - 2018,來學(xué)習(xí)門新的編程語言吧!

    摘要:入門,第一個(gè)這是一門很新的語言,年前后正式公布,算起來是比較年輕的編程語言了,更重要的是它是面向程序員的函數(shù)式編程語言,它的代碼運(yùn)行在之上。它通過編輯類工具,帶來了先進(jìn)的編輯體驗(yàn),增強(qiáng)了語言服務(wù)。 showImg(https://segmentfault.com/img/bV1xdq?w=900&h=385); 新的一年不知不覺已經(jīng)到來了,總結(jié)過去的 2017,相信小伙們一定有很多收獲...

    Drummor 評論0 收藏0
  • Python多版本切換工具-Pyenvvirtualenv及Anaconda科學(xué)計(jì)算環(huán)境的配置

    摘要:為了安裝科學(xué)計(jì)算環(huán)境,控制好版本,今天上午總算折騰好了。切換和使用新的虛擬環(huán)境這樣就能切換為這個(gè)版本的虛擬環(huán)境。通過輸入查看現(xiàn)在版本,可以發(fā)現(xiàn)處于虛擬環(huán)境下了。指定包的版本多個(gè)版本并存,尤其是和的并存。下面用創(chuàng)建一個(gè)名叫的版本為的環(huán)境。 為了安裝Anaconda科學(xué)計(jì)算環(huán)境,控制好python版本,今天上午總算折騰好了。 學(xué)習(xí)python有時(shí)希望在python2.7環(huán)境下,有時(shí)希望在...

    rozbo 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<