在日常经常写一些 Python 命令行脚本来简化操作,有一些代码逻辑是通用的,直接让 AI 生成的话,风格不够统一,还需要不断调整,这里提供一个命令行脚本的初始模板,包括日志(支持彩色)和命令行参数解析。

template_script.py
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
import logging
import argparse
import os

__version__ = "0.1.0"


class Colors:
RED = "\033[31m"
GREEN = "\033[32m"
YELLOW = "\033[33m"
BLUE = "\033[34m"
MAGENTA = "\033[35m"
CYAN = "\033[36m"
RED_BG = "\033[41m"
GRAY = "\033[90m"
RESET = "\033[0m"


class ColoredFormatter(logging.Formatter):
COLORS = {
logging.DEBUG: Colors.RESET,
logging.INFO: Colors.CYAN,
logging.WARNING: Colors.YELLOW,
logging.ERROR: Colors.RED,
}
RESET = Colors.RESET

def format(self, record):
color = self.COLORS.get(record.levelno, self.RESET)
return f"{color}{super().format(record)}{self.RESET}"


def setup_logging(*, use_color, level):
logging.getLogger().setLevel(level)

handler = logging.StreamHandler()
if use_color:
handler.setFormatter(ColoredFormatter("%(message)s"))
else:
handler.setFormatter(logging.Formatter("%(message)s"))

logging.getLogger().addHandler(handler)


# ...


def parse_args():
parser = argparse.ArgumentParser(description="xxx.")
parser.add_argument(
"path",
nargs="?",
default=os.getcwd(),
type=str,
)
parser.add_argument(
"--output-json",
type=str,
metavar="FILE",
help="Write detailed compilation results to a JSON file.",
)

log_group = parser.add_mutually_exclusive_group()
log_group.add_argument(
"--log-debug",
action="store_true",
help="Enable debug-level logging output (default: info).",
)
log_group.add_argument(
"--log-error",
action="store_true",
help="Enable error-level logging output (default: info).",
)

parser.add_argument(
"--dry-run",
action="store_true",
)
parser.add_argument(
"--jobs",
type=int,
default=None,
help="Number of parallel jobs. (default: min(4, CPU count))",
)
parser.add_argument(
"--timeout",
type=int,
default=180,
help="Compilation timeout in seconds for parallel mode. (default: 180s)",
)
parser.add_argument(
"--no-color", action="store_true", help="Disable colored output"
)
parser.add_argument("--version", action="version", version=__version__)

return parser.parse_args()


def main():
args = parse_args()

if args.log_debug:
log_level = logging.DEBUG
elif args.log_error:
log_level = logging.ERROR
else:
log_level = logging.INFO

setup_logging(use_color=not args.no_color, level=log_level)

# ...


if __name__ == "__main__":
main()