# 练习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)
- 下一步