1. 程式人生 > >笨辦法學python 習題46:一個專案骨架

笨辦法學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__.py

Windows下結構也是一樣的。如果以樹狀結構顯示就是:

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只顯示運行了一個測試。這樣有沒有問題?

沒問題,我的也一樣