来自目录的arparse python参数

2024-06-25 22:49:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样的文件结构:

project/ main_prog.py tools/ script.py md_script/ __init__.py md_script.py

我在工具中搜索本地python模块。在这个例子中,它是md\u脚本。我想在我的代码中使用它作为位置参数,比如install,但是当我使用它时,我得到了一个错误:

./jsh.py md_script
usage: jsh.py [-h] {install,call,list,log,restore} ... [md_script]
jsh.py: error: invalid choice: 'md_script' (choose from 'install', 'call', 'list', 'log', 'restore')

ubuntu14.10上的python3.4 这是我的密码:

parser = argparse.ArgumentParser(prog='jsh.py',
    description='Some help.', epilog='Example of usage: some help')
subparsers = parser.add_subparsers()
parser_install = subparsers.add_parser('install', help = 'Install new project.')
parser_install.add_argument('install', nargs='?', help = 'Name of project to be installed')
if os.path.isdir(full/path/to/tools/):
   name_arg = next(os.walk(full/path/to/tools))[1]
   tools_arg = parser.add_argument_group('Tools', 'Modules from tools')
   for element in name_arg:
      tools_arg.add_argument(element, nargs='?', help='md_script description')
args = parser.parse_args()
try:
  if not len(sys.argv) > 1:
     parser.print_help()
  elif 'install' in args:
     do_some_stuff
  elif element in args:
     do_some_md_script_stuff
  else:
     parser.print_help()

Tags: installpyprojectaddparserargscripthelp
2条回答

usage行显示错误:

usage: jsh.py [-h] {install,call,list,log,restore} ... [md_script]

你需要使用类似

jsh.py install md_script

你指定了subparser,所以你必须给它一个subparser名称。你知道吗


usage看起来还创建了代码中没有显示的其他子parser、calllist等。你知道吗

在创建子parser之后,还可以定义位置参数。这就是[md_script]的来源。在创建大量nargs='?'位置(包括install子parser的参数)时要小心。这可能会让你的用户感到困惑。事实上,这似乎让你困惑。记住subparser实际上是一个位置参数(需要一个字符串)。你知道吗

我建议在创建一个如此复杂的解析器之前,先试用一个更简单的解析器。你知道吗


因此,从您的注释和示例中,我看到您的目标是让用户命名一个模块,这样您的脚本就可以以某种方式调用它。因为用这些名字填充子帕瑟是有意义的。你知道吗

我想知道为什么还要创建一个同名的可选位置参数:

module_pars = subparsers.add_parser(element, help = 'Modules from tools')
module_pars.add_argument(element, nargs='?', help=element+' description')

这是因为您使用属性的存在作为调用此子parser的证据吗?你知道吗

elif element in args:
    do_some_md_script_stuff

argparse文档还有一些其他的想法。你知道吗

One particularly effective way of handling sub-commands is to combine the use of the add_subparsers() method with calls to set_defaults() so that each subparser knows which Python function it should execute.

以及

However, if it is necessary to check the name of the subparser that was invoked, the dest keyword argument to the add_subparsers() call will work:

这些避免了一个“?”的混乱位置参数,使您可以使用子参数获取真实信息。你知道吗

subparsers = parser.add_subparsers(dest='module')
....
for element in name_arg:
    # module_pars = 'parser_'+element   # this does nothing
    module_pars = subparsers.add_parser(element, help = 'Modules from tools')
    module_pars.set_defaults(func = do_some_md_script_stuff)
    # or module_pars.set_default(element='I am here')
    module_pars.add_argument('real_argument')

现在您可以检查:

if args.module='md_script':
    do_some_md_script_stuff(args)

或者

if hasattr(args, 'func'):
    func(args)

使用替代方法set_defaults,您的原始测试应该仍然有效:

if element in args:
    do_some_md_script_stuff

我是这样做的。这正是我想要的。你知道吗

if os.path.isdir(TOOLS_PATH):
   name_arg = next(os.walk(TOOLS_PATH))[1]
   for element in name_arg:
      module_pars = 'parser_'+element
      module_pars = subparsers.add_parser(element, help = 'Modules from tools')
      module_pars.add_argument(element, nargs='?', help=element+' description')

我没有测试它,因为我没有测试模块,但是./jsh.py md_script进入elif element in args: print('md_script')并打印字符串。所以看起来很管用。 谢谢你的回复。你知道吗

编辑:我测试过了。在add_参数中,我必须更改nargs='?'for nargs='*'以捕获多个参数。 为了从命令行捕获参数,我使用了以下命令:

elif args:
   for element in name_arg:
      if element in args:
         element_arg = sys.argv[2:]
         done_cmd,msg = opt_exec_module(element,*element_arg)
         my_logger(done_cmd,msg)

不是很优雅,但很管用。你知道吗

相关问题 更多 >