我有这样的文件结构:
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()
usage
行显示错误:你需要使用类似
你指定了subparser,所以你必须给它一个subparser名称。你知道吗
从
usage
看起来还创建了代码中没有显示的其他子parser、call
、list
等。你知道吗在创建子parser之后,还可以定义位置参数。这就是
[md_script]
的来源。在创建大量nargs='?'
位置(包括install
子parser的参数)时要小心。这可能会让你的用户感到困惑。事实上,这似乎让你困惑。记住subparser
实际上是一个位置参数(需要一个字符串)。你知道吗我建议在创建一个如此复杂的解析器之前,先试用一个更简单的解析器。你知道吗
因此,从您的注释和示例中,我看到您的目标是让用户命名一个模块,这样您的脚本就可以以某种方式调用它。因为用这些名字填充子帕瑟是有意义的。你知道吗
我想知道为什么还要创建一个同名的可选位置参数:
这是因为您使用属性的存在作为调用此子parser的证据吗?你知道吗
argparse
文档还有一些其他的想法。你知道吗以及
这些避免了一个“?”的混乱位置参数,使您可以使用子参数获取真实信息。你知道吗
现在您可以检查:
或者
使用替代方法
set_defaults
,您的原始测试应该仍然有效:我是这样做的。这正是我想要的。你知道吗
我没有测试它,因为我没有测试模块,但是
./jsh.py md_script
进入elif element in args: print('md_script')
并打印字符串。所以看起来很管用。 谢谢你的回复。你知道吗编辑:我测试过了。在add_参数中,我必须更改nargs='?'for nargs='*'以捕获多个参数。 为了从命令行捕获参数,我使用了以下命令:
不是很优雅,但很管用。你知道吗
相关问题 更多 >
编程相关推荐