笨辦法學python 習題46:一個專案骨架
專案骨架
學會如何建立一個專案的“骨架”目錄。這個骨架目錄具備讓專案跑起來的所有基本內容。裡邊會包含你的專案檔案佈局、自動測試程式碼、模組及安裝指令碼。當你要建立一個新專案的時候,只需將這個目錄複製進去,改改目錄的名字,再編輯裡邊的檔案就行了。
Python軟體包的安裝
需要預先安裝一些軟體包,安裝軟體包的方法太多,所以不提供詳細安裝步驟,只告訴需要安裝哪些東西,然後自己搞定。這對你有好處,你將開啟一個全新的世界,裡邊充滿了其他人釋出的Python軟體。
安裝以下軟體包:
不要只是手動下載並且安裝這些軟體包,還應該看一下別人的建議,尤其針對你的作業系統別人是怎樣建議你安裝和使用的。同樣軟體包在不一樣的作業系統上安裝方式是不一樣的,不一樣版本的Linux和OSX會有不同,而Windows更是不同。
此過程會相當無趣。業內將這種事情叫做“yak shaving”(剃犛牛):在做一件有意義的事情之前的一些準備工作,而這些準備工作又是極其無聊和冗繁的。 你要做一個很酷的Python專案,但建立骨架目錄需要你安裝一些軟體包,而安裝軟體包之前還要安裝軟體包安裝工具(package installer),而要安裝這個工具還得先學會如何在你的作業系統下安裝軟體。。。你需要做的就是克服它。
注意: 有時Python安裝程式並不新增C:/Python27/Script到系統路徑(PATH)中。若遇到這種情況,可像習題0中針對C:/Python27所做那樣,使用一下語句將其新增到系統路徑中:[Environment]::SetEnvironment Variable("Path", "$env:Path;C:\Python27\Script", "User")
建立骨架專案目錄
首先使用下述命令建立骨架目錄的結構:
$ mkdir projects # 用一個叫projects的目錄來儲存自己的各個專案
$ cd projects/
$ mkdir skeleton # 在projects中建立一個叫skeleton的目錄—新專案的基礎目錄
$ cd skeleton
$ mkdir bin
$ mkdir NAME # NAME目錄是你專案的主模組,使用骨架時可任意取名
$ mkdir tests
$ mkdir docs
接下來設定一些初始檔案。在Linux/OSX環境下進行配置:
$ touch NAME/__init__.py
$ touch tests/__init__.py
在Windows PowerShell中設定方式如下:
$ new-item -type file NAME/__init__.py
$ new-item -type file tests/__init__.py
以上命令建立了新模組目錄,以供後面為其新增程式碼。然後我們需要建立一個setup.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:
# NAME_tests.py
from nose.tools import *
import NAME
def setup():
print "SETUP!"
def teardown():
print 'TEAR DOWN!"
def test_basic():
print "I RAN!"
最終目錄結構
完成一切準備工作時,Unix目錄應如下:
$ ls -R
NAME bin docs setup.py tests
./NAME:__init__.py
./bin:
./docs:
./tests:NAME_tests.py __init__.pyWindows下結構也是一樣的。如果以樹狀結構顯示就是:
setup.pyNAME/ __init__.pybin/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 .. # get out of the 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. 複製這份骨架目錄,把名字改為新專案的名字
2. 再將NAME模組更名為你需要的名字,它可以是你的專案的名字,當然別的名字也行
3. 編輯setup.py, 讓它包含新專案的相關資訊。
4. 重新命名tests/NAME_tests.py, 讓它的名字匹配到你的模組的名字。
5. 使用nosetests檢查有無錯誤。
6. 開始寫程式碼。
小測驗
1. 找文件閱讀,學會使用前面安裝了的軟體包。
2. 找到關於setup.py的文件,看它裡邊可以做多少配置。Python的安裝器並不是一個好軟體,所以使用起來也非常奇怪。
3. 建立一個專案,在模組目錄裡寫一些程式碼,並讓這個模組可以執行。
4. 在bin目錄下放一個可執行的指令碼。找材料學習一下怎樣建立可在系統下執行的Python指令碼。
5. 在setup.py中加入bin裡的指令碼,這樣你安裝時就可連它安裝進去。
6. 使用setup.py安裝你的模組,並確定安裝的模組可正常使用,最後使用pip將其解除安裝
常見問題回答
這些指令在Windows下能用嗎?
應該可以,但某些版本可能遇到一點困難。自己研究並嘗試,直至搞定為止,或找有經驗朋友幫忙也可以。
Windows下好像不能執行nosetests?
有時Python安裝程式並不新增C:/Python27/Script到系統路徑(PATH)中。若遇到這種情況,可像習題0中針對C:/Python27所做那樣,使用一下語句將其新增到系統路徑中:[Environment]::SetEnvironment Variable("Path", "$env:Path;C:\Python27\Script", "User")
setup.py的配置字典中該放些什麼資訊進去?
讀讀distutils的文件就知道了: http://docs.python.org/distutils/setupscript.html
沒法載入NAME模組,遇到了ImportError?
確定建立了NAME/__init__.py檔案。若用的Windows,那就在檢查一下是否被命名為NAME/__init__.py.txt,有的編輯器會預設弄成這個樣子。
為什麼非要弄個bin/資料夾?
這只是一個標準位置,用來存放從命令列執行的指令碼,但這不是存放模組的地方。
有沒有實際專案程式碼可以給我看看?
很多Python專案都用了類似的結構,你可看看這個簡單專案:http://gitorious.org/python-modargs
我的nosetests只顯示運行了一個測試。這樣有沒有問題?
沒問題,我的也一樣