Python简单项目:命令行工具①

323 阅读5分钟

2024-07-09_175549.png

1. 引言

命令行工具(Command Line Tools)是通过命令行界面(CLI)运行的软件程序。在许多开发和运维工作中,命令行工具扮演着至关重要的角色。它们可以用来自动化任务、管理系统、处理数据等。Python凭借其强大的标准库和丰富的第三方库,成为开发命令行工具的绝佳选择。

本文将详细介绍如何使用Python创建一个简单但功能强大的命令行工具,涉及命令行参数解析、文件操作、错误处理等方面。最后,我们将通过一个综合实例展示命令行工具的开发过程,并给出运行结果。

2. 命令行参数解析

2.1 使用argparse模块

Python的argparse模块是用于解析命令行参数的标准库。它能够自动生成帮助和使用信息,并对参数进行类型检查。

2.1.1 基本用法

首先,导入argparse模块并创建一个解析器:

import argparse

parser = argparse.ArgumentParser(description="命令行工具示例")

然后,可以添加命令行参数:

parser.add_argument('--name', type=str, required=True, help='用户的姓名')
parser.add_argument('--age', type=int, help='用户的年龄')

最后,解析命令行参数:

args = parser.parse_args()
print(f"姓名: {args.name}")
if args.age:
    print(f"年龄: {args.age}")

保存以上代码为cli_tool.py,然后在命令行中运行:

python cli_tool.py --name 张三 --age 25

输出结果:

姓名: 张三
年龄: 25

2.2 高级用法

argparse模块还支持子命令、位置参数、互斥参数等高级功能。

2.2.1 子命令

子命令允许在一个工具中实现多种功能,例如git命令的不同子命令(如git commitgit push)。

parser = argparse.ArgumentParser(description="命令行工具示例")
subparsers = parser.add_subparsers(dest='command')

# 添加子命令 'greet'
greet_parser = subparsers.add_parser('greet', help='打印问候语')
greet_parser.add_argument('--name', type=str, required=True, help='用户的姓名')

# 添加子命令 'farewell'
farewell_parser = subparsers.add_parser('farewell', help='打印告别语')
farewell_parser.add_argument('--name', type=str, required=True, help='用户的姓名')

args = parser.parse_args()

if args.command == 'greet':
    print(f"你好, {args.name}!")
elif args.command == 'farewell':
    print(f"再见, {args.name}!")

运行命令:

python cli_tool.py greet --name 张三
python cli_tool.py farewell --name 李四

输出结果:

你好, 张三!
再见, 李四!
2.2.2 互斥参数

互斥参数组中的参数不能同时使用。例如,一个工具中不能同时指定--verbose--quiet参数:

parser = argparse.ArgumentParser(description="命令行工具示例")
group = parser.add_mutually_exclusive_group()
group.add_argument('--verbose', action='store_true', help='详细模式')
group.add_argument('--quiet', action='store_true', help='安静模式')

args = parser.parse_args()

if args.verbose:
    print("详细模式")
elif args.quiet:
    print("安静模式")
else:
    print("普通模式")

运行命令:

python cli_tool.py --verbose
python cli_tool.py --quiet

输出结果:

详细模式
安静模式

3. 文件操作

命令行工具通常需要处理文件,如读取配置文件、处理数据文件等。Python的osshutil模块提供了丰富的文件和目录操作功能。

3.1 读取文件

使用open函数读取文件内容:

with open('example.txt', 'r') as file:
    content = file.read()
    print(content)

3.2 写入文件

使用open函数写入文件内容:

with open('output.txt', 'w') as file:
    file.write('Hello, World!')

3.3 复制和删除文件

使用shutil模块复制和删除文件:

import shutil

shutil.copy('example.txt', 'copy_example.txt')
shutil.rmtree('output.txt')

4. 错误处理

在开发命令行工具时,必须处理可能出现的各种错误。Python的异常处理机制使得这一任务变得简单。

try:
    with open('example.txt', 'r') as file:
        content = file.read()
except FileNotFoundError:
    print("文件未找到")
except Exception as e:
    print(f"发生错误: {e}")

5. 日志记录

使用logging模块记录命令行工具的运行日志,可以帮助开发者调试和排查问题。

import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

logger.info("命令行工具启动")

6. 综合实例

现在,我们将综合以上内容,创建一个功能完整的命令行工具。这个工具将实现以下功能:

  1. 读取配置文件
  2. 处理数据文件
  3. 打印日志信息
  4. 支持命令行参数

6.1 项目结构

创建一个名为data_processor的目录,结构如下:

data_processor/
├── config.yaml
├── data/
   └── input.csv
├── logs/
   └── app.log
├── main.py
└── requirements.txt

6.2 配置文件(config.yaml)

log_level: INFO
input_file: data/input.csv
output_file: data/output.csv

6.3 数据文件(data/input.csv)

name,age
张三,25
李四,30
王五,22

6.4 依赖文件(requirements.txt)

PyYAML

6.5 主程序(main.py)

import argparse
import csv
import logging
import os
import yaml

def load_config(config_file):
    with open(config_file, 'r') as file:
        config = yaml.safe_load(file)
    return config

def setup_logging(log_level, log_file):
    os.makedirs(os.path.dirname(log_file), exist_ok=True)
    logging.basicConfig(level=getattr(logging, log_level),
                        format='%(asctime)s - %(levelname)s - %(message)s',
                        handlers=[logging.FileHandler(log_file),
                                  logging.StreamHandler()])

def process_data(input_file, output_file):
    with open(input_file, 'r') as infile, open(output_file, 'w', newline='') as outfile:
        reader = csv.DictReader(infile)
        fieldnames = reader.fieldnames + ['processed']
        writer = csv.DictWriter(outfile, fieldnames=fieldnames)
        writer.writeheader()
        for row in reader:
            row['processed'] = 'yes'
            writer.writerow(row)

def main():
    parser = argparse.ArgumentParser(description="数据处理命令行工具")
    parser.add_argument('--config', type=str, default='config.yaml', help='配置文件路径')
    args = parser.parse_args()

    config = load_config(args.config)
    setup_logging(config['log_level'], 'logs/app.log')

    logging.info("开始处理数据")
    process_data(config['input_file'], config['output_file'])
    logging.info("数据处理完成")

if __name__ == '__main__':
    main()

6.6 运行程序

在命令行中运行以下命令:

python main.py --config config.yaml

输出结果:

2024-07-09 12:00:00,000 - INFO - 开始处理数据
2024-07-09 12:00:00,000 - INFO - 数据处理完成

生成的输出文件(data/output.csv)内容如下:

name,age,processed
张三,25,yes
李四,30,yes
王五,22,yes

7. 总结

本文详细介绍了如何使用Python创建一个命令行工具,涵盖了命令行参数解析、文件操作、错误处理、日志记录等方面。通过综合实例展示了一个完整的命令行工具的开发过程。希望读者通过本文能够掌握Python命令行工具的开发技巧,并能在实际项目中加以应用。


欢迎点赞|关注|收藏|评论,您的肯定是我创作的动力