一篇文章入門Python生態系統

譯者按:原文寫於2011年底,雖然文中關於Python 3的一些說法能夠說已經不成立了,可是做爲一篇面向從其餘語言轉型到Python的程序員來講,本文對Python的生態系統仍是作了較爲全面的介紹。文中提到了一些第三方庫,可是Python社區中強大的第三方庫並不止這些,歡迎各位Pytonistas補充。html

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

開發者從PHP、Ruby或其餘語言轉到Python時,最常碰到的第一個障礙,就是缺少對Python生態系統的全面瞭解。開發者常常但願能有一個教程或是資源,向他們介紹如何以大體標準的方式完成大部分的任務。linux

本文中的內容,是對我所在公司內部維基百科的摘錄,記錄了面向網絡應用開發的Python生態系統基礎知識,目標受衆則是公司實習生、培訓人員以及從其餘語言轉型到Python的資深開發者。git

文中所列的內容或資源是不完整的。我也打算把它當成一項一直在進行中的工做(work in perpetual progress)。但願通過不斷的增補修訂,本文會成爲Python生態系統方面的一篇詳盡教程。程序員

目標受衆

本文的目的,不是教你們Python編程語言。讀完這篇教程,你也不會瞬間變成一名Python高手。我假設你們已經有必定的Python基礎。若是你是初學者,那麼別再繼續讀下去了。先去看看Zed Shaw所寫的《笨辦法學Python》,這是本質量很高的免費電子書,看完以後再回頭閱讀這篇教程吧。github

我假設大家使用的是Linux(最好是Ubuntu/Debian)或是類Linux操做系統。爲何?由於這是我最熟悉的系統。我在Windows平臺或Mac OS X平臺上,沒有專業的編程經驗,只是測試過不一樣瀏覽器的兼容性。若是你用的是這兩個平臺,那麼請參考下面的資料安裝Python。sql

你還可以使用搜索引擎,查找你使用的操做系統中安裝Python的最好方法。若是你有什麼疑問,我強烈建議你去Stack Overflow平臺上提問。

該選擇哪一個版本?

Python 2.x是目前的主流;Python 3是嶄新的將來。若是你不關心這個問題,能夠直接跳到下面的Python安裝部分。(譯者注:原文做者寫這篇文章時是2011年,當時Python 3才發展沒幾年。)

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

目前有兩個積極開發中的Python版本——2.7.x與3.x(也被稱爲Python 3, Py3K和Python 3000)。Python 3是一個不一樣於Python 2的語言。兩者在語義、語法上,既存在細微的區別,又有着大相徑庭的一面。截至今天,Python2.6/2.7是安裝數量和使用度最高的版本。許多主流的Python庫、框架、工具都沒有作到100%兼容Python 3。

所以,最穩妥的選擇就是使用2.x版(更準確的說,即2.7.x)。務必只在你須要或者徹底瞭解狀況的前提下,才選擇Python 3。

Python 3 Wall of Shame網站記錄了Python 3對各類庫的兼容狀況。在使用Python 3以前,仔細查閱下這個網站的內容。

譯者注:如今,主流第三方庫和框架對Python 3的支持度已經很高。根據py3readiness網站的統計,360個最受歡迎的Python包中已經有315個支持Python 3。具體的支持狀況,能夠查看這個網站。必定程度上說,Python 3已經成爲新的主流。

使用哪一種虛擬機

Python的解釋器,又叫作Python虛擬機,它有多種不一樣的實現。其中,主流實現方式是CPython,裝機量也最高,同時也是其餘虛擬機的參考實現。

PyPy是利用Python語言實現的Python;Jython則使用Java實現,並運行在Java虛擬機之上;IronPython是用.NET CLR實現的Python。

除非真的有重大理由,不然應該選擇CPython版本的實現,避免出現意外狀況。

若是這些有關版本和虛擬機的嘮叨話讓你讀了頭疼,那你只須要使用CPython 2.7.x便可。

Python安裝

大部分Linux/Unix發行版和Mac OS X都預裝了Python。若是你沒有安裝或者已有的版本比較舊,那麼你能夠經過下面的命令安裝2.7.x版:

Ubuntu/Debian及其衍生系統

$ sudo apt-get install python2.7

sudo是類Unix系統中的一個程序,可讓用戶以其餘用戶的權限(一般是超級用戶或root用戶)運行程序。

Fedora/Red Hat及相似系統

sudo yum install python2.7

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

在本文後面的示例中,我會使用sudo程序;你應將其替換爲本身版本中的相應命令或程序。

理解Python的包(package)

首先你須要瞭解的是,Python沒有默認的包管理工具。事實上,Python語言中包的概念,也是十分鬆散的。

你可能也知道,Python代碼按照模塊(module)劃分。一個模塊,能夠是隻有一個函數的單個文件,也能夠是包含一個或多個子模塊的文件夾。包與模塊之間的區別很是小,每一個模塊同時也能夠視做一個包。

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

與其餘編程環境相似,Python中也有一些函數和類(好比strlenException)是存在於全局做用域(global scope,在Python中被稱爲builtin scope)的,其餘的函數和類則須要經過import語句進行引用。例如:

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

這些包就在你的文件系統中的某處,因此能被import語句發現。那麼Python是怎麼知道這些模塊的地址?原來,在你安裝Python虛擬機的時候,就自動設置了這些地址。固然平臺不一樣,這些地址也就不同。

你能夠經過sys.path查看系統中的包路徑。這是個人筆記本運行該命令以後的輸出結果,系統是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搜索指定包的全部路徑,這個路徑就存儲在一個Python列表數據類型中。它會先從第一個路徑開始,一直往下檢索,直到找到匹配的路徑名。這意味着,若是兩個不一樣的文件夾中包含了兩個同名的包,那麼包檢索將會返回其遇到的第一個絕對匹配地址,不會再繼續檢索下去。

你如今可能也猜到了,咱們能夠輕鬆地修改(hack)包檢索路徑,作到你指定的包第一個被發現。你只須要運行下面的代碼:

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

儘管這種作法在不少狀況下十分有用,可是你必須牢記sys.path很容易被濫用。務必在必要時才使用這種方法,而且不要濫用。

site模塊控制着包檢索路徑設置的方法。每次Python虛擬機初始化時,就會被自動引用。若是你想更詳細地瞭解整個過程,能夠查閱官方文檔

PYTHONPATH環境變量

PYTHONPATH是一個能夠用來加強默認包檢索路徑的環境變量。能夠把它看做是一個PATH變量,可是一個只針對Python的變量。它只是一些包含有Python模塊的文件路徑列表(不是sys.path所返回的Python列表),每一個路徑之間以:分隔。設置方法很簡單,以下:

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

在某些狀況下,你不用覆蓋已有的PYTHONPATH,只須要在開頭或結尾加上新的路徑便可。

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

PYTHONPATH、sys.path.insert`和其餘相似的方法,都是hack小技巧,通常狀況下最好不要使用。若是它們可以解決本地開發環境出現的問題,可使用,可是你的生產環境中不該該依賴這些技巧。要取得一樣的效果,咱們還能夠找到更加優雅的方法,稍後我會詳細介紹。

如今你明白了Python如何查找已安裝的包,咱們就能夠回到一開始的那個問題了。Python中,模塊和包的區別究竟是什麼?包就是一個或多個模塊/子模塊的集合,通常都是以通過壓縮的tarball文件形式傳輸,這個文件中包含了:1. 依賴狀況(若是有的話);2.將文件複製到標準的包檢索路徑的說明;3. 編譯說明——若是文件中包含了必需要通過編譯才能安裝的代碼。就是這點區別。

第三方包(Third Party packages)

若是想利用Python進行真正的編程工做,你從一開始就須要根據不一樣的任務安裝第三方包。

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

  1. 使用系統自己自帶的包管理器(deb, rpm等)

  2. 經過社區開發的相似pip, easy_install等多種工具

  3. 從源文件安裝

這三種方法作的幾乎是同一件事情,即安裝依賴包,視狀況編譯代碼,而後把包中模塊複製到標準包檢索路徑。

儘管第二種和第三種方法在全部操做系統中的實現都一致,我仍是要再次建議你查閱Stack Overflow網站的問答,找到你所使用系統中其餘安裝第三方包的方法。

去哪找第三方包?

在安裝第三方包以前,你得先找到它們。查找包的方法有不少。

  1. 你使用的系統自帶的包管理器

  2. Python包索引(也被稱爲PyPI)

  3. 各類源碼託管服務,如LaunchpadGithubBitbucket等。

經過系統自帶的包管理器安裝

使用系統自帶的包管理器安裝,只須要在命令行輸入相應命令,或是使用你用來安裝其餘應用的GUI應用便可。舉個例子,要在Ubuntu系統上安裝simplejson(一個JSON解析工具),你能夠輸入下面的命令:

$ sudo apt-get install python-simplejson

經過pip安裝

easy_install已經不太受開發者歡迎。本文將重點介紹easy_install的替代者——pip

pip是一個用來安裝和管理Python包的工具。它並非一個Python虛擬機自帶的模塊,因此咱們須要先安裝。在Linux系統中,我通常會這樣操做:

$ sudo apt-get install python-pip

在安裝其餘包以前,我老是會把pip升級到PyPI中的最新版本,由於Ubuntu默認源中的版本比PyPI的低。我這樣升級pip

$ sudo pip install pip --upgrade

如今,你能夠經過運行run pip install package-name,安裝任何Python包。因此,要安裝simplejson的話,你能夠運行如下命令:

$ sudo pip install simplejson

移除包也同樣簡單。

$ sudo pip uninstall simplejson

pip默認會安裝PyPI上最新的穩定版,可是不少時候,你會但願安裝指定版本的包,由於你的項目依賴那個特定的版本。要想指定包的版本,你能夠這樣作:

$ sudo pip install simplejson==2.2.1

你還會常常須要升級、降級或者重裝一些包。你能夠經過下面的命令實現:

$ 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

接下來,假設你想安裝某個包的開發版本,可是代碼沒有放在PyPI上,而是在版本控制倉庫中,你該怎麼辦?pip也能夠知足這個需求,可是在此以前,你須要在系統上安裝相應的版本控制系統(VCS)。在Ubuntu平臺,你能夠輸入下面的命令:

$ sudo apt-get install git-core mercurial subversion

安裝好VCS以後,你能夠經過下面的方式從遠程倉庫中安裝一個包:

$ 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

從本地倉庫中安裝也一樣簡單。注意下面文件系統路徑部分的三個斜槓(///)。

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

經過git協議安裝時,請注意,你要像下面這樣使用git+git前綴:

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

如今,你可能在納悶這些命令中的eggs是什麼東西?目前你只須要知道,一個egg就是經zip壓縮以後的Python包,其中包含了包的源代碼和一些元數據。pip在安裝某個包以前,會構建相關的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="bob@redivi.com",
    url="http://github.com/simplejson/simplejson",
    license="MIT License",
    packages=['simplejson', 'simplejson.tests'],
    platforms=['any'],
    **kw)

假如沒有setup.py文件呢?你該怎麼查找egg的名字?答案是,你根本不用去找。只要把包的源代碼拷貝到你的項目文件夾,以後就能夠和你本身寫的代碼同樣引用和使用啦。

--user參數

以上全部的例子,都是在系統層面安裝指定的包。若是你使用pip install時,加上--user這個參數,這些包將會安裝在該用戶的'~/.local`文件夾之下。例如,在個人機器上,運行效果是這樣的:

$ 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這個Python包的安裝路徑(/home/mir/.local/bin/markdown2

不在系統層面安裝全部的Python包有不少理由。稍後在介紹如何爲每一個項目設置單獨、孤立的Python環境時,我會具體說明。

從源文件安裝

從源文件安裝Python包,只須要一行命令。將包文件解壓,而後運行下面的命令:

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

儘管這種安裝方法與其餘的方法沒什麼區別,可是要記住:pip永遠是安裝Python包的推薦方法,由於pip可讓你輕鬆升級/降級,不須要額外手動下載、解壓和安裝。從源文件安裝時若是其餘方法都行不通時,你的最後選擇(通常不會存在這種狀況)。

安裝須要編譯的包

雖然咱們已經介紹了大部分與包安裝相關的內容,仍有一點咱們沒有涉及:含有C/C++代碼的Python包在安裝、使用以前,須要先編譯。最明顯的例子就是數據庫適配器(database adapters)、圖像處理庫等。

儘管pip能夠管理源文件的編譯,我我的更喜歡經過系統自帶的包管理器安裝這類包。這樣安裝的就是預編譯好的二進制文件。

若是你仍想(或須要)經過pip安裝,在Ubuntu系統下你須要執行下面的操做。

安裝編譯器及相關工具:

$ sudo apt-get install build-essential

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

$ sudo aptitude install python-dev-all

若是你的系統發行版本中沒有提供python-dev-all,請查找名字相似python-devpython2.X-dev的相關包。

假設你要安裝psycopg2(PostgreSQL數據庫的Python適配器),你須要安裝PostgreSQL的開發文件。

$ sudo aptitude install  postgresql-server-dev-all

知足這些依賴條件以後 ,你就能夠經過pip install安裝了。

$ sudo pip install psycopg2

這裏應該記住一點:並不是全部這類包都兼容pip安裝方式。可是,若是你自信能夠成功編譯源文件,而且(或者)已經有目標平臺上的必要經驗和知識,那麼你徹底能夠按照這種方式安裝。

開發環境

不一樣的人設置開發環境的方法也不一樣,可是在幾乎全部的編程社區中,確定有一種方法(或者超過一種)比其餘方法的接受度更高。儘管開發環境設置的與別人不一樣沒有問題,通常來講接受度更高的方法經受住了高強度的測試,並被證明能夠簡化一些平常工做的重複性任務,而且能夠提升可維護性。

virtualenv

Python社區中設置開發環境的最受歡迎的方法,是經過virtualenv。Virtualenv是一個用於建立孤立Python環境的工具。那麼如今問題來了:爲何咱們須要孤立的Python環境?要回答這個問題,請容許我引用virtualenv的官方文檔。

咱們要解決的問題之一,就是依賴包和版本的管理問題,以及間接地解決權限問題。假設你有一個應用須要使用LibFoo V1,可是另外一個應用須要V2。那麼你如何使用兩個應用呢?若是你把須要的包都安裝在/usr/lib/python2.7/site-packages(或是你的系統默認路徑),很容易就出現你不當心更新了不該該更新的應用。

簡單來講,你的每個項目均可以擁有一個單獨的、孤立的Python環境;你能夠把所需的包安裝到各自孤立的環境中。

仍是經過pip安裝virutalenv。

$ sudo pip install virtualenv

安裝完以後,運行下面的命令,爲你的項目建立孤立的Python環境。

$ 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.

那麼這行代碼都作了些什麼呢?你建立了一個名叫my_project_venv的文件夾,用於存儲新的Python環境。--distribute參數告訴virtualenv使用基於distribute包開發的新的、更好的打包系統,而不是基於setuptools的舊系統。你如今只須要知道,--distribute參數將會自動在虛擬環境中安裝pip,免去了手動安裝的麻煩。隨着你的Python編程經驗和知識增長,你會慢慢明白這個過程的具體細節。

如今查看my_project_venv文件夾中的內容,你會看到相似下面的文件夾結構:

# 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

經過下面的命令,激活虛擬環境:

$ cd my_project_venv
$ source bin/activate

使用source命令啓動activate腳本以後,你的命令行提示符應該會變成這樣:

:::bash 
(my_project_venv)$

虛擬環境的名稱會添加在$提示符的前面。

如今運行下面的命令,關閉虛擬環境:

:::bash 
(my_project_venv)$ deactivate

當你在系統層面安裝virtualenv時(若是激活了虛擬環境,請先關閉),能夠運行下面的命令幫助本身理解。

首先,咱們來看看若是咱們在終端輸入python或者pip,系統會使用哪一個執行文件。

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

如今再操做一次,可是首先要激活virtualenv,注意輸出結果的變化。在個人機器上,命令的輸出結果時這樣的:

$ 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可執行文件,而後建立了一些功能腳本以及你在項目開發期間用於安裝、升級、刪除相關包的文件夾路徑。它還施展了一些包檢索路徑/PYTHONPATH魔法,確保實現如下幾點:1. 在你安裝第三方包時,它們被安裝在了當前激活的虛擬環境,而不是系統環境中;2. 當在代碼中引用第三方包時,當前激活的虛擬環境中的包將優先於系統環境中的包。

這裏有很重要的一點要注意:系統Python環境中安裝的全部包,默認是能夠在虛擬環境中調用的。這意味着,若是你在系統環境中安裝了simplejson包,那麼全部的虛擬環境將自動得到這個包的地址。你能夠在建立虛擬環境時,經過添加--no-site-packages選項,取消這個行爲,就像這樣:

$ virtualenv my_project_venv --no-site-packages

virtualenvwrapper

virtualenvwrappervirtualenv的封裝器(wrapper),提供了一些很是好的功能,便捷了建立、激活、管理和銷燬虛擬環境的操做,不然將會是件雜事。你能夠運行以下命令安裝virtualenvwrapper

$ sudo pip install virtualenvwrapper

安裝結束以後,你須要進行一些配置。下面是個人配置:

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。其餘的配置則是根據個人我的偏好進行的。

將上面的配置添加到~/.bashrc文件的最後,而後在你當前打開的終端界面中運行下面的命令:

$ source ~/.bashrc

關掉全部打開的終端窗口和Tab窗口,也能取得一樣地效果。當你再次打開終端窗口或Tab窗口時,~/.bashrc將會被執行,自動設置好你的virtualenvwrapper

如今若是想建立、激活、關閉或是刪除虛擬環境,你能夠運行下面的代碼:

$ mkvirtualenv my_project_venv
$ workon my_project_venv
$ deactivate
$ rmvirtualenv my_project_venv

virtualenvwrapper還支持tab自動補全功能。

你能夠前往virtualenvwrapper項目主頁查看更多命令和配置選項。

經過pip和virtualenv進行基本的依賴包管理

pipvirtualenv結合使用,能夠爲項目提供基本的依賴包管理功能。

你可使用pip freeze導出目前安裝的包列表。例如,下面就是我用來開發這個博客網站所用的Python包:

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

注意,我使用了-l選項。它告訴pip只導出當前激活的虛擬環境中安裝的包,忽略全局安裝的包。

你能夠將導出的列表保存至文件,並把文件添加到版本控制系統(VCS)。

$ pip freeze -l  > requirements.txt

經過pip,咱們能夠從寫入了pip freeze命令結果的文件中,安裝相應的包。

其餘重要工具

前面咱們介紹了有關Python版本、虛擬機和包管理的基礎知識,可是平常工做中還有其餘任務須要使用專門的工具來完成。雖然我沒法詳細介紹每個工具,我會盡可能作一個大概的介紹。

提早說聲對不起,由於下面介紹的大部分工具都是與網絡應用開發相關的。

編輯器

提供在Python中進行編程的優秀編輯器有不少。我我的傾向於Vim,可是我不想引起一場編輯器優劣大戰

對Python編程支持較好地編輯器和集成開發環境(IDEs),主要有Vim/GVim, Emacs, GNOME主題下的GEdit, Komodo Edit, Wing IDE, PyCharm等。還有其餘編輯器,可是上面列舉的這些應該是最受歡迎的。你應該選擇最適合本身的工具。

Pyflakes:源碼檢查

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

你能夠經過pip安裝:

$ pip install pyflakes

而後像下面那樣,在命令行調用pyflakes,傳入Python源文件做爲參數:

$ pyflakes filename.py

Pyflakes還能夠嵌入到你的編輯器中。下面這張圖顯示的是嵌入了Vim以後的狀況。注意出現了紅色的波浪線。

pyflakes in vim

你能夠在Stack Overflow上諮詢如何在你使用的編輯器重添加Pyflakes支持。

Requests:爲人類開發的HTTP庫

Requests庫讓你輕輕鬆鬆使用HTTP協議。

首先經過pip安裝:

$ pip install requests

下面是一個簡單的使用示例:

>>> 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:網絡開發微框架

Flask是一個基於Werkzeug與Jinja2這兩個庫的Python微框架。

首先經過pip安裝:

$ pip install Flask

下面是一個簡單的使用示例:

from flask import Flask
app = Flask(__name__)

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

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

這樣運行Flask應用:

$ python hello.py

Flask官網

Django:面向網絡開發的全棧框架

Django是一個全棧網絡框架。它提供了ORM、HTTP庫、表格處理、XSS過濾、模板引擎以及其餘功能。

這樣經過pip安裝:

$ pip install Django

前往Django官網,跟着教程學習便可。很是簡單。

Fabric:簡化使用SSH部署網站和執行系統管理任務的方式

Fabric是一個命令行工具,能夠簡化使用SSH進行網站部署或執行系統管理任務的過程。

它提供了一套基本的操做,能夠執行本地或遠程命令行命令,上傳/下載文件,以及提示用戶進行輸入或者取消執行等輔助性功能。

你能夠經過pip安裝:

$ pip install fabric

下面是用Fabric寫的一個簡單任務:

from fabric.api import run

def host_type():
    run('uname -s

接下來,你能夠在一個或多個服務器上執行該任務:

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

Done.
Disconnecting from localhost... done.

Fabric官網

SciPy:Python中的科學計算工具

若是你的工做涉及科學計算或數學計算,那麼SciPy就是必不可少的工具。

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

前往SciPy官網,獲取詳細的下載/安裝說明以及文檔。

PEP 8:Python風格指南

雖然PEP 8自己不是一個工具,但毋庸置疑的是,它是Python開發方面一個很是重要的文件。

PEP 8這個文件中,定義了主流Python發行版本中標準庫的編碼規範。文件的惟一目的,就是確保其餘的Python代碼都能遵照一樣地代碼結構以及變量、類和函數命名規律。確保你充分了解並遵循該風格指南。

PEP 8連接

強大的Python標準庫

Python的標準庫內容很是豐富,提供了大量的功能。標準庫中包含了衆多內建模塊(built-in modules,用C語言編寫的),能夠訪問相似文件讀/寫(I/O)這樣的系統功能,還包括了用Python編寫的模塊,提供了平常編程中許多問題的標準解決方案。其中一些模塊的設計思路很明顯,就是要鼓勵和加強Python程序的可移植性,所以將平臺相關的細節抽象爲了避免依賴於平臺的API接口。

查看標準庫的官方文檔

推薦閱讀

David Goodger的《如何像Python高手同樣編程》一文,深刻介紹了許多Python的慣用法和技巧,能夠馬上爲你增添許多有用的工具。

Doug Hellmann的系列文章Python Module of the Week。這個系列的焦點,是爲Python標準庫中模塊編寫示例代碼。

結語

我在本文中所介紹的內容,觸及的還只是Python生態系統的表面。Python世界中,幾乎針對每個你能想象到的任務,都存在相關的工具、庫和軟件。這些明顯沒法在一篇文章中盡述。你必需要本身慢慢探索。

Python有偉大的社區,社區中的人很聰明,也頗有耐心,樂於幫助Python語言的初學者。因此,你能夠選擇一個最喜歡的開源項目,去它的IRC頻道找人聊天;關注郵件列表,並積極提問;和有豐富Python系統實施經驗的人交談。慢慢地,隨着你的經驗和知識逐步積累,你也會成爲他們之中的一員。

最後,我爲你們推薦Python之禪。反覆回味、思考這幾段話,你必定會有所啓發!

>>> 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!
相關文章
相關標籤/搜索