# 練習46.項目骨架
這里你將學會如何建立一個項目“骨架”目錄。這個骨架目錄具備讓項目跑起來的所有基本內容。它里邊會包含你的項目文件布局、自動化測試代碼,模組,以及安裝腳本。當你建立一個新項目的時候,只要把這個目錄復制過去,改改目錄的名字,再編輯里邊的文件就行了。
## 安裝Python 軟件包的
你需要使用pip預先安裝一些軟件包,不過問題就來了。我的本意是讓這本書越清晰越干凈越好,不過安裝軟件的方法是在是太多了,如果我要一步一步寫下來,那 10 頁都寫不完,而且告訴你吧,我本來就是個懶人。
所以我不會提供詳細的安裝步驟了,我只會告訴你需要安裝哪些東西,然后讓你自己搞定。即使我給了你所需軟件詳盡的安裝說明,你還是不得不與之奮斗。計算機更新換代非常頻繁,你在安裝過程中遇到問題的時候,可以在網上搜索解決方案。
你需要安裝下面的軟件包:
> 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),而要安裝這個工具你還得先學會如何在你的操作系統下安裝軟件,真是煩不勝煩呀。
無論如何,還是克服困難把。你就把它當做進入編程俱樂部的一個考驗。每個程序員都會經歷這條道路,在每一段“酷”的背后總會有一段“煩”的。
> **NOTE:**有時候python的安裝程序不會把`C:\Python27\Script`加入到系統的`PATH`中,如果你遇到了這個問題,就參照練習0自己把這個目錄加上:`[Environment]::SetEnvironmentVariable("Path", "$env:Path;C:\Python27\Scripts", "User")`
## 創建骨架內容
首先使用下述命令創建你的骨架目錄:
~~~
$ mkdir projects
$ cd projects/
$ mkdir skeleton
$ cd skeleton
$ mkdir bin NAME tests docs
~~~
我使用了一個叫`projects`的目錄,用來存放我自己的各個項目。然后我在里邊建立了一個叫做`skeleton`的文件夾,這就是我們新項目的基礎目錄。其中叫做`NAME`的文件夾是你的項目的主文件夾,你可以將它任意取名。
接下來我們要配置一些初始文件:
~~~
$ touch NAME/__init__.py
$ touch tests/__init__.py
~~~
在windows上,你可以這樣配置初始文件:
~~~
$ new-item -type file NAME/__init__.py
$ new-item -type file tests/__init__.py
~~~
以上命令為你創建了空的模組目錄,以供你后面為其添加代碼。然后我們需要建立一個`setup.py`文件,這個文件在安裝項目的時候我們會用到它:
~~~
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)
~~~
編輯這個文件,把自己的聯系方式寫進去,然后放到那里就行了。
最后你需要一個簡單的測試專用的骨架文件叫`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!"
~~~
## 最終的目錄結構
當你完成一切設置,你的目錄應該看起來像我在這里:
~~~
skeleton/
NAME/
__init__.py
bin/
docs/
setup.py
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 .. # 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
~~~
一定要記住這一點,因為人們經常犯這個錯誤。
## 測試你的配置
安裝了所有上面的軟件包以后,你就可以做下面的事情了:
~~~
$ 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`將其卸載。
## 常見問題
### Q: 這些說明在windows上也是一樣的嗎?
> 是的,不過也取決于你windows系統的版本,你可能需要在配置上下點功夫它才能正常運行,堅持研究并嘗試,直到你能在windows上正常的運行這個骨架,或者你可以找一些有python+windows開發經驗的人幫忙。
### Q: 我好像不能在windows上運行`nosetests`
> 有時候python的安裝程序不會把`C:\Python27\Script`加入到系統的`PATH`中,如果你遇到了這個問題,就參照練習0自己把這個目錄加上:`[Environment]::SetEnvironmentVariable("Path", "$env:Path;C:\Python27\Scripts", "User")`
### Q: 我應該在我的配置文件`setup.py`中放些什么?
> 確認你閱讀了distutils的文檔`http://docs.python.org/distutils/setupscript.html`。
### Q:我好像不能加載`NAME`模塊,而且還有個"ImportError"報錯
> 確認你創建了`NAME/__init__.py`這個文件,如果你用的windows系統,確認你沒有把這文件命名為`NAME/__init__.py.txt`,很多程序員都犯過這個錯。
### Q: 我們為什么需要一個`bin/`文件夾
> 這只是一個用來存放在命令行執行的腳本的地方,不是用來存在模塊的。
### Q: 你有一個真實的項目舉例嗎?
> 有很多python寫的項目都可以作為實例,你可以看看我創建的這個簡單的項目`https://gitorious.org/python-modargs`.
### Q: 我的`nosetests`運行時只顯示正在運行一個測試,這是正確的嗎?
> 是的,我的也是這么顯示的。
- 序言
- 前言
- 簡介
- 0:安裝和準備
- 1:第一個程序
- 2:注釋和“#”井號
- 3:數字和數學計算
- 4:變量和命名
- 5:更多的變量和打印
- 6:字符串和文本
- 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:學會說面向對象
- 42:對象、類、以及從屬關系
- 43:基本的面向對象的分析和設計
- 44:繼承Vs.包含
- 45:你來制作一個游戲
- 46:項目骨架
- 47:自動化測試
- 48:更復雜的用戶輸入
- 49:寫代碼語句
- 50:你的第一個網站
- 51:從瀏覽器獲取輸入
- 52:開始你的web游戲
- 來自老程序員的建議
- 下一步
- 附錄A:命令行教程
- 簡介
- 安裝和準備
- 路徑, 文件夾, 名錄 (pwd)
- 如果你迷路了
- 創建一個路徑 (mkdir)
- 改變當前路徑 (cd)
- 列出當前路徑 (ls)
- 刪除路徑 (rmdir)
- 目錄切換(pushd, popd)
- 生成一個空文件(Touch, New-Item)
- 復制文件 (cp)
- 移動文件 (mv)
- 查看文件 (less, MORE)
- 輸出文件 (cat)
- 刪除文件 (rm)
- 退出命令行 (exit)
- 下一步