Python中能否为entry points定义层级结构实现子命令调用?
实现方案
完全可以实现你要的层级调用效果,setuptools的entry_points本身不直接支持多层级命令声明,我们可以通过单总入口+子命令分发的方式实现,具体步骤如下:
方法1:配合第三方命令行框架实现(推荐,以click为例)
这种方式代码简洁,原生支持子命令、参数校验、帮助信息自动生成,是主流项目的常用方案。
- 首先修改
setup.py的entry_points配置,只保留一个项目根命令的总入口:
entry_points={ 'console_scripts': [ 'project_name = module.main:cli' ] }
- 在你项目的
module/main.py文件中实现子命令分发逻辑:
import click # 导入你原来的三个业务函数 from module.file import function0, function1, function2 @click.group() def cli(): # 根命令的全局逻辑可以写在这里,没有可以留空 pass # 注册三个子命令 @cli.command(name='entry_point_name0') @click.argument('args', nargs=-1) def run_func0(args): function0(args) @cli.command(name='entry_point_name1') @click.argument('args', nargs=-1) def run_func1(args): function1(args) @cli.command(name='entry_point_name2') @click.argument('args', nargs=-1) def run_func2(args): function2(args) if __name__ == '__main__': cli()
配置完成安装后,就可以直接用project_name entry_point_name0 <args>的格式调用对应功能。
方法2:用Python标准库argparse实现(无额外依赖)
如果不想引入第三方依赖,可以用Python自带的argparse模块实现子命令分发:
setup.py的配置和方法1完全一致,只留一个根命令入口。- 在
module/main.py中编写如下逻辑:
import argparse from module.file import function0, function1, function2 def main(): parser = argparse.ArgumentParser(prog='project_name') # 注册子命令解析器 subparsers = parser.add_subparsers(dest='sub_command', required=True) # 给每个子命令添加参数规则 parser0 = subparsers.add_parser('entry_point_name0', help='对应function0的功能说明') parser0.add_argument('args', nargs='*', help='function0需要的参数') parser1 = subparsers.add_parser('entry_point_name1', help='对应function1的功能说明') parser1.add_argument('args', nargs='*', help='function1需要的参数') parser2 = subparsers.add_parser('entry_point_name2', help='对应function2的功能说明') parser2.add_argument('args', nargs='*', help='function2需要的参数') args = parser.parse_args() # 根据子命令分发到对应业务函数 if args.sub_command == 'entry_point_name0': function0(args.args) elif args.sub_command == 'entry_point_name1': function1(args.args) elif args.sub_command == 'entry_point_name2': function2(args.args) if __name__ == '__main__': main()
两种方案都只会在系统中生成一个project_name根命令,不会生成多个独立的入口命令,完全符合你需要的调用格式。
内容的提问来源于stack exchange,提问作者Gustavo
相关产品推荐
相关产品推荐

