# 习题 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 游戏
- 下一步
- 老程序员的建议