项目骨架

学会如何建立一个项目的“骨架”目录。这个骨架目录具备让项目跑起来的所有基本内容。里边会包含你的项目文件布局、自动测试代码、模块及安装脚本。当你要建立一个新项目的时候,只需将这个目录复制进去,改改目录的名字,再编辑里边的文件就行了。

Python软件包的安装

需要预先安装一些软件包,安装软件包的方法太多,所以不提供详细安装步骤,只告诉需要安装哪些东西,然后自己搞定。这对你有好处,你将打开一个全新的世界,里边充满了其他人发布的Python软件。

安装以下软件包:

1. pip: http://pypi.python.org/pypi/pip

2. distribute: http://pypi.python.org/pypi/distribute

3. nose: http://pypi.python.org/pypi/nose

4. virtualenv: http://pypi.python.org/pypi/virtualenv

不要只是手动下载并且安装这些软件包,还应该看一下别人的建议,尤其针对你的操作系统别人是怎样建议你安装和使用的。同样软件包在不一样的操作系统上安装方式是不一样的,不一样版本的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.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 ..                       # 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只显示运行了一个测试。这样有没有问题?

没问题,我的也一样

10-04 13:32