這里你將學(xué)會(huì)如何建立一個(gè)項(xiàng)目“骨架”目錄。這個(gè)骨架目錄具備讓項(xiàng)目跑起來(lái)的所有基本內(nèi)容。它里邊會(huì)包含你的項(xiàng)目文件布局、自動(dòng)化測(cè)試代碼,模組,以及安裝腳本。當(dāng)你建立一個(gè)新項(xiàng)目的時(shí)候,只要把這個(gè)目錄復(fù)制過(guò)去,改改目錄的名字,再編輯里邊的文件就行了。
你需要使用pip預(yù)先安裝一些軟件包,不過(guò)問(wèn)題就來(lái)了。我的本意是讓這本書(shū)越清晰越干凈越好,不過(guò)安裝軟件的方法是在是太多了,如果我要一步一步寫(xiě)下來(lái),那 10 頁(yè)都寫(xiě)不完,而且告訴你吧,我本來(lái)就是個(gè)懶人。
所以我不會(huì)提供詳細(xì)的安裝步驟了,我只會(huì)告訴你需要安裝哪些東西,然后讓你自己搞定。即使我給了你所需軟件詳盡的安裝說(shuō)明,你還是不得不與之奮斗。計(jì)算機(jī)更新?lián)Q代非常頻繁,你在安裝過(guò)程中遇到問(wèn)題的時(shí)候,可以在網(wǎng)上搜索解決方案。
你需要安裝下面的軟件包:
- pip – http://pypi.python.org/pypi/pip
- distribute – http://pypi.python.org/pypi/distribute
- nose – http://pypi.python.org/pypi/nose/
- virtualenv – http://pypi.python.org/pypi/virtualenv
不要只是手動(dòng)下載并且安裝這些軟件包,你應(yīng)該看一下別人的建議,尤其看看針對(duì)你的操作系統(tǒng)別人是怎樣建議你安裝和使用的。同樣的軟件包在不一樣的操作系統(tǒng)上面的安裝方式是不一樣的,不一樣版本的 Linux 和 OSX 會(huì)有不同,而 Windows 更是不同。
我要預(yù)先警告你,這個(gè)過(guò)程會(huì)是相當(dāng)無(wú)趣。在業(yè)內(nèi)我們將這種事情叫做 “yak shaving(剃牦牛)”。它指的是在你做一件有意義的事情之前的一些準(zhǔn)備工作,而這些準(zhǔn)備工作又是及其無(wú)聊冗繁的。你要做一個(gè)很酷的 Python 項(xiàng)目,但是創(chuàng)建骨架目錄需要你安裝一些軟件包,而安裝軟件包之前你還要安裝軟件包安裝工具(package installer),而要安裝這個(gè)工具你還得先學(xué)會(huì)如何在你的操作系統(tǒng)下安裝軟件,真是煩不勝煩呀。
無(wú)論如何,還是克服困難把。你就把它當(dāng)做進(jìn)入編程俱樂(lè)部的一個(gè)考驗(yàn)。每個(gè)程序員都會(huì)經(jīng)歷這條道路,在每一段“酷”的背后總會(huì)有一段“煩”的。
NOTE:有時(shí)候python的安裝程序不會(huì)把
C:\Python27\Script
加入到系統(tǒng)的PATH
中,如果你遇到了這個(gè)問(wèn)題,就參照練習(xí)0自己把這個(gè)目錄加上:[Environment]::SetEnvironmentVariable("Path", "$env:Path;C:\Python27\Scripts", "User")
首先使用下述命令創(chuàng)建你的骨架目錄:
$ mkdir projects
$ cd projects/
$ mkdir skeleton
$ cd skeleton
$ mkdir bin NAME tests docs
我使用了一個(gè)叫projects
的目錄,用來(lái)存放我自己的各個(gè)項(xiàng)目。然后我在里邊建立了一個(gè)叫做skeleton
的文件夾,這就是我們新項(xiàng)目的基礎(chǔ)目錄。其中叫做NAME
的文件夾是你的項(xiàng)目的主文件夾,你可以將它任意取名。
接下來(lái)我們要配置一些初始文件:
$ touch NAME/__init__.py
$ touch tests/__init__.py
在windows上,你可以這樣配置初始文件:
$ new-item -type file NAME/__init__.py
$ new-item -type file tests/__init__.py
以上命令為你創(chuàng)建了空的模組目錄,以供你后面為其添加代碼。然后我們需要建立一個(gè)setup.py
文件,這個(gè)文件在安裝項(xiàng)目的時(shí)候我們會(huì)用到它:
try:
from setuptools import setup
except ImportError:
from distutils.core import setup
config = {
'description': 'My Project',
'author': 'My Name',
'url': 'URL to get it at.',
'download_url': 'Where to download it.',
'author_email': 'My email.',
'version': '0.1',
'install_requires': ['nose'],
'packages': ['NAME'],
'scripts': [],
'name': 'projectname'
}
setup(**config)
編輯這個(gè)文件,把自己的聯(lián)系方式寫(xiě)進(jìn)去,然后放到那里就行了。
最后你需要一個(gè)簡(jiǎn)單的測(cè)試專用的骨架文件叫tests/NAME_tests.py
:
from nose.tools import *
import NAME
def setup():
print "SETUP!"
def teardown():
print "TEAR DOWN!"
def test_basic():
print "I RAN!"
當(dāng)你完成一切設(shè)置,你的目錄應(yīng)該看起來(lái)像我在這里:
skeleton/
NAME/
__init__.py
bin/
docs/
setup.py
tests/
NAME_tests.py
__init__.py
從現(xiàn)在開(kāi)始,你應(yīng)該在這個(gè)目錄下運(yùn)行命令。如果你不能執(zhí)行ls -R
命令并看到相似的目錄結(jié)構(gòu),說(shuō)明你在一個(gè)錯(cuò)誤的目錄下。比如,人們經(jīng)常會(huì)到tests/
目錄下嘗試執(zhí)行文件,那肯定是無(wú)法運(yùn)行的。要運(yùn)行你應(yīng)用的測(cè)試用例,你也應(yīng)該在目錄tests/
的上一層目錄執(zhí)行,加入你這樣執(zhí)行:
$ cd tests/ # WRONG! WRONG! WRONG!
$ nosetests
----------------------------------------------------------------------
Ran 0 tests in 0.000s
OK
那結(jié)果肯定是錯(cuò)誤的,你應(yīng)當(dāng)在tests/
目錄的上一層目錄執(zhí)行,所以為了修正你的錯(cuò)誤,你應(yīng)該這樣做:
$ cd .. # get out of tests/
$ ls # CORRECT! you are now in the right spot
NAME bin docs setup.py tests
$ nosetests
.
----------------------------------------------------------------------
Ran 1 test in 0.004s
OK
一定要記住這一點(diǎn),因?yàn)槿藗兘?jīng)常犯這個(gè)錯(cuò)誤。
安裝了所有上面的軟件包以后,你就可以做下面的事情了:
$ nosetests
.
----------------------------------------------------------------------
Ran 1 test in 0.007s
OK
下一節(jié)練習(xí)中我會(huì)告訴你nosetests
的功能,不過(guò)如果你沒(méi)有看到上面的畫(huà)面,那就說(shuō)明你哪里出錯(cuò)了。確認(rèn)一下你的NAME
和tests
目錄下存在 __init__.py
, 并且你沒(méi)有把 tests/NAME_tests.py
命名錯(cuò)。
剃牦牛的事情已經(jīng)做的差不多了,以后每次你要新建一個(gè)項(xiàng)目時(shí),只要做下面的事情就可以了:
- 拷貝這份骨架目錄,把名字改成你新項(xiàng)目的名字。
- 再將
NAME
模組更名為你需要的名字,它可以是你項(xiàng)目的名字,當(dāng)然別的名字也行。- 編輯
setup.py
讓它包含你新項(xiàng)目的相關(guān)信息。- 重命名
tests/NAME_tests.py
,讓它的名字匹配到你模組的名字。- 使用
nosetests
檢查有無(wú)錯(cuò)誤。- 開(kāi)始寫(xiě)代碼吧。
本節(jié)沒(méi)有附加題,不過(guò)有一些小測(cè)驗(yàn)需要你完成
- 找文檔閱讀,學(xué)會(huì)使用你前面安裝了的軟件包。
- 閱讀關(guān)于
setup.py
的文檔,看它里邊可以做多少配置。Python 的安裝器并不是一個(gè)好軟件,所以使用起來(lái)也非常奇怪。- 創(chuàng)建一個(gè)項(xiàng)目,在模組目錄里寫(xiě)一些代碼,并讓這個(gè)模組可以運(yùn)行。
- 在
bin
目錄下放一個(gè)可以運(yùn)行的腳本,找材料學(xué)習(xí)一下怎樣創(chuàng)建可以在系統(tǒng)下運(yùn)行的 Python 腳本。- 在你的
setup.py
中加入bin
這個(gè)目錄,這樣你安裝時(shí)就可以連它安裝進(jìn)去。- 使用
setup.py
安裝你的模組,并確定安裝的模組可以正常使用,最后使用pip
將其卸載。
是的,不過(guò)也取決于你windows系統(tǒng)的版本,你可能需要在配置上下點(diǎn)功夫它才能正常運(yùn)行,堅(jiān)持研究并嘗試,直到你能在windows上正常的運(yùn)行這個(gè)骨架,或者你可以找一些有python+windows開(kāi)發(fā)經(jīng)驗(yàn)的人幫忙。
nosetests
有時(shí)候python的安裝程序不會(huì)把
C:\Python27\Script
加入到系統(tǒng)的PATH
中,如果你遇到了這個(gè)問(wèn)題,就參照練習(xí)0自己把這個(gè)目錄加上:[Environment]::SetEnvironmentVariable("Path", "$env:Path;C:\Python27\Scripts", "User")
setup.py
中放些什么?確認(rèn)你閱讀了distutils的文檔
http://docs.python.org/distutils/setupscript.html
。
NAME
模塊,而且還有個(gè)"ImportError"報(bào)錯(cuò)確認(rèn)你創(chuàng)建了
NAME/__init__.py
這個(gè)文件,如果你用的windows系統(tǒng),確認(rèn)你沒(méi)有把這文件命名為NAME/__init__.py.txt
,很多程序員都犯過(guò)這個(gè)錯(cuò)。
bin/
文件夾這只是一個(gè)用來(lái)存放在命令行執(zhí)行的腳本的地方,不是用來(lái)存在模塊的。
有很多python寫(xiě)的項(xiàng)目都可以作為實(shí)例,你可以看看我創(chuàng)建的這個(gè)簡(jiǎn)單的項(xiàng)目
https://gitorious.org/python-modargs
.
nosetests
運(yùn)行時(shí)只顯示正在運(yùn)行一個(gè)測(cè)試,這是正確的嗎?是的,我的也是這么顯示的。
更多建議: