这是一个用于快速创建Python 3程序的命令行参数解析代码和帮助文本的程序。该程序允许用户通过命令行参数来指定生成程序的名称和参数,从而生成相应的Python代码。
要使用这个程序,可以通过以下命令行来调用:
python create_python_prog.py <program_name> [parameter 1] [parameter 2] ... [parameter N]
或者使用帮助参数来获取使用说明:
python create_python_prog.py [-h | --help]
程序接受的参数用于指定生成程序的名称和参数。每个参数是一个逗号分隔的列表,格式如下:
<variable_name[=initial_value]>[,parameter_type][,parameter_count_token]
[,-one_char_switch][,--long_switch]
其中,变量名称是必须的,并且必须放在第一位。可选的参数类型、参数计数标记和参数开关可以以任何顺序出现。
变量名称必须以英文字母开头,其余部分可以包含英文字母、数字或下划线字符 '_' 。如果字符串类型的初始值包含空格,则必须用双引号括起来。布尔类型的有效默认值只有 False 和 True 。
参数类型可以是以下字符之一:
如果没有指定参数类型,则默认为字符串参数。
可选的计数标记控制接受指定参数类型的参数数量。如果数量超过一个,则由给定名称指定的变量将是Python列表。这个可选的计数参数在参数解析器代码中用作 'nargs' 。
如果没有指定参数计数标记,则在运行时,命令行上只为该参数输入一个值。如果参数计数标记指示多个值,则变量名称将标识一个Python列表实例,并且输入的每个值都将被生成的解析代码添加到列表中。
一个初始的连字符 '-' 表示参数开关。单个连字符表示单字符开关名称。两个初始连字符指定长名称开关。可以指定短名称开关和长名称开关。
'-h' 和 '--help' 开关是自动实现的,不应作为开关参数指定。当运行生成的程序时,使用任一帮助开关将输出生成程序开头的 __doc__ 字符串。
布尔参数,参数类型为 'b' 或 'bool',只能是一个可选的开关参数。在生成的程序中使用开关为布尔参数将导致布尔参数的变量名称设置为初始值的相反值。如果没有指定初始值,则布尔参数的默认值为 False 。
以下是一些生成程序的示例命令行:
python create_python_prog.py foo alpha,i beta,f,+ file_name gamma,b,-g,--gma
这个命令行生成一个名为 'foo.py' 的程序,它接受一个名为 'alpha' 的整数参数,一个或多个浮点参数,这些参数在一个名为 'beta' 的列表中,然后是一个名为 'file_name' 的字符串参数,最后是一个可选的名为 'gamma' 的布尔值参数,只有在指定 '-g' 开关或 '--gma' 开关时才为 'True' 。
python create_python_prog.py foo file_name='bar.txt',?
命令行中的 '?' 字符使 'file_name' 参数成为可选参数。如果没有指定参数,则变量 'file_name' 设置为 'bar.txt' 。
生成的代码使用了Python的参数解析器模块。要添加参数,使用了 'add_argument' 方法。'add_mutually_exclusive_group' 和 'subparsers' 方法没有使用。如果需要,相对容易修改生成的代码以使用这些额外的方法。
以下是使用以下命令创建的示例生成程序:
python create_python_prog.py foo.py text_desc amount,i value=0.5,f,? maxval,f,-m,--max display_flag,b,-d,--disp
#!/usr/bin/env python
"""
python foo.py <text_desc> <amount> [value] [-m <maxval> | --max <maxval>]
[-d <display_flag> | --disp <display_flag>]
python foo.py [-h | --help]
TODO: Add usage information here.
"""
import sys
# TODO: Uncomment or add imports here.
import os
import re
import time
import urllib
import subprocess
from argparse import ArgumentParser
def foo_main(text_desc, amount, value, maxval, display_flag):
"""
TODO: Add docstring here.
"""
# TODO: Add or delete code here.
# Dump all passed argument values.
print(f"{text_desc=}")
print(f"{amount=}")
print(f"{value=}")
print(f"{maxval=}")
print(f"{display_flag=}")
return 0
# Start of main program.
def main(argv=None):
# Initialize the command line parser.
parser = ArgumentParser(description='TODO: Text to display before the argument help.',
epilog=f'Copyright (c) 2022 TODO: your-name-here.',
add_help=True,
argument_default=None,
usage=__doc__)
parser.add_argument(action='store', dest='text_desc', help='A string value that TODO:')
parser.add_argument(action='store', dest='amount', type=int, help='A integer value that TODO:')
parser.add_argument(action='store', dest='value', type=float, default=0.5, nargs='?', help='A floating point value that TODO:')
parser.add_argument('-n', '--max', action='store', dest='maxval', type=float, default=0.0, help='A floating point value that TODO:')
parser.add_argument('-d', '--disp', action='store_true', dest='display_flag', default=False, help='A Boolean value that TODO:')
# Parse the command line.
arguments = parser.parse_args(args=argv)
text_desc = arguments.text_desc
amount = arguments.amount
value = arguments.value
maxval = arguments.maxval
display_flag = arguments.display_flag
status = 0
try:
foo_main(text_desc, amount, value, maxval, display_flag)
except ValueError as value_error:
print(value_error)
status = -1
except OSError as os_error:
print(os_error)
status = -1
except MemoryError as mem_error:
print(mem_error)
status = -1
return status
if __name__ == "__main__":
sys.exit(main())
Python python foo.py -h
usage:
python foo.py <text_desc> <amount> [value] [-m <maxval> | --max <maxval>]
[-d <display_flag> | --disp <display_flag>]
python foo.py [-h | --help]
TODO: Add usage information here.
TODO: Text to display before the argument help.
positional arguments:
text_desc A string value that TODO:
amount A integer value that TODO:
value A floating point value that TODO:
options:
-h, --help show this help message and exit
-m MAXVAL, --max MAXVAL A floating point value that TODO:
-d, --disp A Boolean value that TODO:
Copyright (c) 2022 TODO: your-name-here.
如果想要打印变量名和值,例如:
some_variable='variable_value'
Python3.8 及更高版本使用 f-strings 非常容易,只需在变量名后添加等号,即 '= ' 。上面的输出就是用以下行打印的。这适用于字符串、整数、浮点和布尔变量。
print(f"{some_variable=}")
如果使用的是Python3.8 之前的版本,则上面的行必须更改为:
print(f"some_variable={some_variable}")
认为这是唯一需要为 Python 3.x 的早期版本更改的特性。