# Python 与命令行交互

URL: https://caijiao.org/python/ch10/cli
Source: docs/python/ch10/cli.md
Description: 本章介绍如何通过 Python 与命令行进行交互，讲解如何获取用户输入、处理命令行参数，并使用 Python 编写命令行工具。

[Python](/python/) 提供了多种与命令行交互的方法，可以用于获取用户输入、处理命令行参数以及创建命令行工具。本章将介绍常见的与命令行交互的技巧，包括 `input()` 函数、`argparse` 模块以及如何编写脚本来接受命令行参数。

## 使用 `input()` 获取用户输入

Python 的 `input()` 函数用于从命令行读取用户输入。此函数会暂停程序的执行，等待用户输入数据并按下回车键，然后将输入的内容作为字符串返回。

### 示例：获取用户输入

```python
name = input("请输入你的名字: ")
print(f"你好，{name}！")
```

运行该脚本时，程序会提示用户输入名字，然后输出个性化的问候语。

### 注意

- `input()` 函数总是返回字符串类型，如果需要将输入转换为其他类型（如整数或浮点数），需要使用 `int()` 或 `float()` 函数进行转换。

```python
age = int(input("请输入你的年龄: "))
print(f"你的年龄是: {age}岁")
```

## 使用 `argparse` 处理命令行参数

`argparse` 模块是 Python 标准库中处理命令行参数的强大工具。它可以帮助我们从命令行读取参数、生成帮助信息，并自动进行类型转换和参数验证。

### 示例：使用 `argparse` 解析命令行参数

```python
import argparse

# 创建解析器对象
parser = argparse.ArgumentParser(description="一个示例命令行工具")

# 添加命令行参数
parser.add_argument("name", help="你的名字")
parser.add_argument("age", type=int, help="你的年龄")

# 解析命令行参数
args = parser.parse_args()

# 打印结果
print(f"你好，{args.name}！你的年龄是：{args.age}岁")
```

### 运行命令行工具

```
python script.py Alice 30
```

输出：

```
你好，Alice！你的年龄是：30岁
```

在这个示例中，`argparse` 模块定义了两个命令行参数：`name` 和 `age`。`argparse` 会自动处理参数的解析，并将其作为属性添加到返回的 `args` 对象中。

## 可选参数与默认值

`argparse` 还支持可选参数，并允许为这些参数指定默认值。通过使用 `--` 前缀，我们可以定义可选的命令行参数。

### 示例：使用可选参数

```python
import argparse

# 创建解析器对象
parser = argparse.ArgumentParser(description="一个带有可选参数的命令行工具")

# 添加可选参数
parser.add_argument("--greeting", default="Hello", help="问候语")

# 解析命令行参数
args = parser.parse_args()

# 打印结果
print(f"{args.greeting}, Python！")
```

### 运行命令行工具

```
python script.py --greeting "Hi"
```

输出：

```
Hi, Python！
```

如果不指定 `--greeting` 参数，则会使用默认值 `Hello`。

## 处理命令行错误

当命令行参数格式不正确时，`argparse` 会自动生成错误信息并显示给用户。我们还可以自定义错误处理逻辑。

### 示例：处理缺失参数

```python
import argparse

# 创建解析器对象
parser = argparse.ArgumentParser(description="示例命令行工具，缺少参数时抛出错误")

# 添加参数
parser.add_argument("name", help="你的名字")

try:
    # 解析命令行参数
    args = parser.parse_args()
    print(f"你好，{args.name}！")
except SystemExit as e:
    print("命令行参数错误，程序退出")
```

如果运行时缺少必需的参数，`argparse` 会自动显示错误信息，并退出程序。

## 编写命令行工具

Python 还允许我们将命令行工具打包为脚本，可以通过在终端直接调用它来执行。

### 示例：创建可执行的 Python 脚本

```bash
#!/usr/bin/env python3
import argparse

def main():
    parser = argparse.ArgumentParser(description="命令行工具示例")
    parser.add_argument("action", choices=["greet", "bye"], help="选择动作")
    args = parser.parse_args()

    if args.action == "greet":
        print("你好，世界！")
    elif args.action == "bye":
        print("再见，世界！")

if __name__ == "__main__":
    main()
```

### 设置执行权限

在 Linux 或 macOS 上，可以通过以下命令将 Python 文件设置为可执行文件：

```bash
chmod +x script.py
```

之后，可以直接通过命令行运行：

```bash
./script.py greet
```

## 总结

- `input()` 函数用于获取用户输入，适合简单的交互。
- `argparse` 模块用于解析命令行参数，适合创建功能丰富的命令行工具。
- `argparse` 支持必选参数、可选参数、默认值及错误处理。
- 可以通过创建可执行脚本来方便地部署命令行工具，提升自动化和便捷性。

通过使用 Python 与命令行交互，我们可以轻松创建强大的命令行工具，使得程序的使用更加灵活、便捷。
