# 習題 46: 一個項目骨架
這里你將學會如何建立一個項目“骨架”目錄。這個骨架目錄具備讓項目跑起來的所有基本內容。它里邊會包含你的項目文件布局、自動化測試代碼,模組,以及安裝腳本。當你建立一個新項目的時候,只要把這個目錄復制過去,改改目錄的名字,再編輯里邊的文件就行了。
### 骨架內容
首先使用下述命令創建你的骨架目錄:
~~~
~ $ mkdir -p projects
~ $ cd projects/
~/projects $ mkdir skeleton
~/projects $ cd skeleton
~/projects/skeleton $ mkdir bin NAME tests docs
~~~
我使用了一個叫 projects 的目錄,用來存放我自己的各個項目。然后我在里邊建立了一個叫做 skeleton 的文件夾,這就是我們新項目的基礎目錄。其中叫做NAME 的文件夾是你的項目的主文件夾,你可以將它任意取名。
接下來我們要配置一些初始文件:
~~~
~/projects/skeleton $ touch NAME/__init__.py
~/projects/skeleton $ touch tests/__init__.py
~~~
以上命令為你創建了空的模組目錄,以供你后面為其添加代碼。然后我們需要建立一個 setup.py 文件,這個文件在安裝項目的時候我們會用到它:
<table class="highlighttable"><tbody><tr><td class="linenos"> <div class="linenodiv"> <pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19</pre> </div> </td> <td class="code"> <div class="highlight"> <pre>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)
</pre> </div> </td> </tr></tbody></table>
編輯這個文件,把自己的聯系方式寫進去,然后放到那里就行了。
最后你需要一個簡單的測試專用的骨架文件叫 tests/NAME_tests.py:
<table class="highlighttable"><tbody><tr><td class="linenos"> <div class="linenodiv"> <pre> 1
2
3
4
5
6
7
8
9
10
11</pre> </div> </td> <td class="code"> <div class="highlight"> <pre>from nose.tools import *
import NAME
def setup():
print "SETUP!"
def teardown():
print "TEAR DOWN!"
def test_basic():
print "I RAN!"
</pre> </div> </td> </tr></tbody></table>
### 最終目錄結構
當你完成了一切準備工作,你的目錄看上去應該和我這里的一樣:
~~~
$ ls -R
NAME bin docs setup.py tests
./NAME:
__init__.py
./bin:
./docs:
./tests:
NAME_tests.py __init__.py
~~~
這是 unix 下看到的東西,不過 Windows 下也是一樣的,如果以樹狀結構顯示就是這個樣子:
~~~
setup.py
NAME/
__init__.py
bin/
docs/
tests/
NAME_tests.py
__init__.py
~~~
從現在開始,你應該在這層目錄運行命令。如果你運行 ls-R 看到的不是這個目錄架構,那你所處的目錄就是錯的。例如人們經常到 tests/ 目錄下運行那里的文件,但這樣是行不通的。要運行你的 測試,你需要到 tests/ 的上一級目錄,也就是我這里顯示的目錄來運行。所以,如果你運行下面的命令:
~~~
$ cd tests/ # WRONG! WRONG! WRONG!
$ nosetests
----------------------------------------------------------------------
Ran 0 tests in 0.000s
OK
~~~
這樣做**大錯特錯**!你必須在 tests 目錄的上一層運行才可以,所以假設你犯了這個錯誤,你應該用下面的方法來正確執行:
~~~
$ cd .. # 離開 tests/ 目錄
$ ls # CORRECT! 現在你所處的目錄是正確的
NAME bin docs setup.py tests
$ nosetests
.
----------------------------------------------------------------------
Ran 1 test in 0.004s
OK
~~~
記住這一條,因為人們經常犯這樣的錯誤。
### Python 軟件包的安裝
你需要預先安裝一些軟件包,不過問題就來了。我的本意是讓這本書越清晰越干凈越好,不過安裝軟件的方法是在是太多了,如果我要一步一步寫下來,那 10 頁都寫不完,而且告訴你吧,我本來就是個懶人。
所以我不會提供詳細的安裝步驟了,我只會告訴你需要安裝哪些東西,然后讓你自己搞定。這對你也有好處,因為你將打開一個全新的世界,里邊充滿了其他人發布的 Python 軟件。
接下來你需要安裝下面的軟件包:
1. pip – [http://pypi.python.org/pypi/pip](http://pypi.python.org/pypi/pip)
1. distribute – [http://pypi.python.org/pypi/distribute](http://pypi.python.org/pypi/distribute)
1. nose – [http://pypi.python.org/pypi/nose/](http://pypi.python.org/pypi/nose/)
1. virtualenv – [http://pypi.python.org/pypi/virtualenv](http://pypi.python.org/pypi/virtualenv)
不要只是手動下載并且安裝這些軟件包,你應該看一下別人的建議,尤其看看針對你的操作系統別人是怎樣建議你安裝和使用的。同樣的軟件包在不一樣的操作系統上面的安裝方式是不一樣的,不一樣版本的 Linux 和 OSX 會有不同,而 Windows 更是不同。
我要預先警告你,這個過程會是相當無趣。在業內我們將這種事情叫做 “yak shaving(剃牦牛)”。它指的是在你做一件有意義的事情之前的一些準備工作,而這些準備工作又是及其無聊冗繁的。你要做一個很酷的 Python 項目,但是創建骨架目錄需要你安裝一些軟件包,而安裝軟件包之前你還要安裝 package installer (軟件包安裝工具),而要安裝這個工具你還得先學會如何在你的操作系統下安裝軟件,真是煩不勝煩呀。
無論如何,還是克服困難把。你就把它當做進入編程俱樂部的一個考驗。每個程序員都會經歷這條道路,在每一段“酷”的背后總會有一段“煩”的。
### 測試你的配置
安裝了所有上面的軟件包以后,你就可以做下面的事情了:
~~~
~/projects/skeleton $ nosetests
.
----------------------------------------------------------------------
Ran 1 test in 0.007s
OK
~~~
下一節練習中我會告訴你 nosetests 的功能,不過如果你沒有看到上面的畫面,那就說明你哪里出錯了。確認一下你的 NAME 和 tests 目錄下存在 __init__.py, 并且你沒有把 tests/NAME_tests.py 命名錯。
### 使用這個骨架
剃牦牛的事情已經做的差不多了,以后每次你要新建一個項目時,只要做下面的事情就可以了:
1. 拷貝這份骨架目錄,把名字改成你新項目的名字。
1. 再將 NAME 模組更名為你需要的名字,它可以是你項目的名字,當然別的名字也行。
1. 編輯 setup.py 讓它包含你新項目的相關信息。
1. 重命名 tests/NAME_tests.py ,讓它的名字匹配到你模組的名字。
1. 使用 nosetests 檢查有無錯誤。
1. 開始寫代碼吧。
### 小測驗
這節練習沒有加分習題,不過需要你做一個小測驗:
1. 找文檔閱讀,學會使用你前面安裝了的軟件包。
1. 閱讀關于 setup.py 的文檔,看它里邊可以做多少配置。Python 的安裝器并不是一個好軟件,所以使用起來也非常奇怪。
1. 創建一個項目,在模組目錄里寫一些代碼,并讓這個模組可以運行。
1. 在 bin 目錄下放一個可以運行的腳本,找材料學習一下怎樣創建可以在系統下運行的 Python 腳本。
1. 在你的 setup.py 中加入 bin 這個目錄,這樣你安裝時就可以連它安裝進去。
1. 使用 setup.py 安裝你的模組,并確定安裝的模組可以正常使用,最后使用 pip 將其卸載。
- 譯者前言
- 前言:笨辦法更簡單
- 習題 0: 準備工作
- 習題 1: 第一個程序
- 習題 2: 注釋和井號
- 習題 3: 數字和數學計算
- 習題 4: 變量(variable)和命名
- 習題 5: 更多的變量和打印
- 習題 6: 字符串(string)和文本
- 習題 7: 更多打印
- 習題 8: 打印,打印
- 習題 9: 打印,打印,打印
- 習題 10: 那是什么?
- 習題 11: 提問
- 習題 12: 提示別人
- 習題 13: 參數、解包、變量
- 習題 14: 提示和傳遞
- 習題 15: 讀取文件
- 習題 16: 讀寫文件
- 習題 17: 更多文件操作
- 習題 18: 命名、變量、代碼、函數
- 習題 19: 函數和變量
- 習題 20: 函數和文件
- 習題 21: 函數可以返回東西
- 習題 22: 到現在你學到了哪些東西?
- 習題 23: 讀代碼
- 習題 24: 更多練習
- 習題 25: 更多更多的練習
- 習題 26: 恭喜你,現在可以考試了!
- 習題 27: 記住邏輯關系
- 習題 28: 布爾表達式練習
- 習題 29: 如果(if)
- 習題 30: Else 和 If
- 習題 31: 作出決定
- 習題 32: 循環和列表
- 習題 33: While 循環
- 習題 34: 訪問列表的元素
- 習題 35: 分支和函數
- 習題 36: 設計和調試
- 習題 37: 復習各種符號
- 習題 38: 閱讀代碼
- 習題 39: 列表的操作
- 習題 40: 字典, 可愛的字典
- 習題 41: 來自 Percal 25 號行星的哥頓人(Gothons)
- 習題 42: 物以類聚
- 習題 43: 你來制作一個游戲
- 習題 44: 給你的游戲打分
- 習題 45: 對象、類、以及從屬關系
- 習題 46: 一個項目骨架
- 習題 47: 自動化測試
- 習題 48: 更復雜的用戶輸入
- 習題 49: 創建句子
- 習題 50: 你的第一個網站
- 習題 51: 從瀏覽器中獲取輸入
- 習題 52: 創建你的 web 游戲
- 下一步
- 老程序員的建議