17.6 使用src、bin和test来组织代码
正如在前面节中所介绍的,不需要复杂的目录结构。简单的Python应用可以生成简单的目录,其中可以包含应用模块、测试模块和setup.py以及REAME。这是一种简单、有效的方式。
然而对于相对复杂的模块和包,经常需要更结构化一些。对于复杂结构,常用的方式是将Python代码分为3部分。举一个具体的例子,对于名为my _ app的应用,会创建以下几个典型的目录。
- my app/my app:这个目录中包含了应用的所有代码。这里包括了各种模块和包。只是对目录命名src提供的信息还不够。这个my app目录应该包含一个空的_ init .py文件,这样应用也充当了包的角色。
- my app/binor my spp/scripts:这个目录中可以包含任何来自OS命令行API的脚本。可以通过使用setup.py来将这些脚本复制到Python的scripts目录中。如之前所介绍的,它们应该像 main .py模块那样非常简短,并且它们可以被Python代码当作OS文件名的别名。
- my app/test:这个目录可以包含不同的unittest模块。这个目录中也应该包含一个空的 init .py文件,这样它就可以被看作是包。也可以在整个包中包含_ main .py来运行所有的测试。
为了避免缺失版本号造成的困惑,最上层的目录名my app可以使用一个版本号来标记。可以使用my app-v1.1作为最上层目录名。在最上层目录中的应用必须有一个适当的Python名称,这样就可以将my app-v1.1/my app作为应用的路径。
为了将应用安装到Python标准库结构中,最上层目录应该包含setup.py文件。详细信息可参见Python模块的分支。当然,在这个目录中还需要包含一个README文件。
当应用模块和测试模块在不同的目录中时,在运行测试的时候需要对应用进行引用,作为一个安装模块。可以使用PYTHONPATH环境变量来完成。可以使用如下代码来运行测试套件。
PYTHONPATH=my_app python3.3 -m test
我们在执行命令的同一行设置了一个环境变量。看起来可能有些奇怪,但它是bash shell的第1级功能,这使得我们可以对PYTHONPATH环境变量做本地化的定义。
