python:创建项目结构(范例)

・5 分钟阅读

我喜欢使用 python创建命令行应用程序,这比编写一个 bash -script需要更多的逻辑。

python有优秀的解析命令行参数和运行其他shell命令的库,同时可以利用面向对象的语言,此外,你还可以使用python单元测试框架的来验证和记录你的应用程序

此文本的示例应用程序可以在 github.com/mrako/python-example-project中找到。

构建应用程序

以我的经验,python项目最好的文件夹结构是将可执行文件放在bin文件夹中,并且将项目放到your project name文件夹中,这样你可以保持你的核心功能分离和重用,它也是其他应用程序的标准。

project文件夹中,你应该将main.py作为应用程序的主访问点,你的功能应该去lib,你的单元测试在tests ,这样,项目的框架应该如下所示:

 

+ bin
 - project
+ project
 - main.py
 + lib
 + tests

现在,你的应用程序可以通过运行以下命令执行:

$ bin/project 

分离参数,shell命令和功能

如同所有面向对象的编程一样,你应该分割你的问题,它在Python应用程序中经常被遗忘,因为读取命令行参数,处理选项和运行其他shell命令非常容易。

解析命令行选项

创建定义和收集命令行参数的类,python提供 optparse,你可以非常轻松地定义选项和行为:

 

usage = 'bin/project'
parser = OptionParser(usage=usage)
parser.add_option('-x', '--example',
 default='example-value',
 dest='example',
 help='An example option')

现在你已经创建了一个解析器,它通过运行以下命令将目标值读取到示例变量,bin/project -x 或者 bin/project --example

运行其他shell命令

如果要创建依赖其他shell命令的应用程序,应将shell执行与它自己的类分开,这样,你的核心功能可以轻松地用于其他环境或应用程序,并且你可以更轻松地收集来自外部源的日志,错误和异常,我建议你使用python 子进程作为外部shell命令。

为进程执行和进程异常(请参见示例项目中的 process-class )创建一个类。

核心功能

在你的project/lib/project.py中,你现在可以实现核心功能,我只包含接收选项(它们已经从收集command-line参数中分离出来),并通过流程类运行date命令,这是一个例子,参见示例项目中的 project.py

运行你的应用程序

bin/project可执行文件调用项目的main.py

 

#!/bin/bash

BINPATH=`dirname $0`
python "$BINPATH/../project/main.py" $@

不要忘记更改执行的访问权限:

$ chmod 755 bin/project

main.py中,你可以收集命令行选项,并且运行你的应用程序:

 

import sys

from lib import Project
from lib import Options

if __name__ == '__main__':
 options = Options()
 opts, args = options.parse(sys.argv[1:])
 v = Project(opts)

 print v.date()

最后,你可以运行应用程序了:

$ bin/project  

测试(并记录)

单元测试中已经写入了python的简短介绍,不能强调测试的重要性,使用单元测试可以指导开发,验证功能,并且记录应用程序的行为。

project/tests文件夹(请参见示例项目中的 tests-folder )中添加测试,我建议你使用 nose来运行你的测试。

测试命令行参数

 

import unittest

from lib import Options

class TestCommandLineArguments(unittest.TestCase):
 def setUp(self):
 self.options = Options()

 def test_defaults_options_are_set(self):
 opts, args = self.options.parse()
 self.assertEquals(opts.example, 'example-value')

运行测试

 

$ nosetests
.....
Ran 5 tests in 0.054s

OK
Xajhqffl profile image