基于先前参数的参数的条件选择
Conditional choices of an argument based on a preceding argument
我想创建一个脚本,它带有两个应该使用的参数:
- directory_path,
- files -- directory_path参数下的文件列表。
我写过类似的东西:
#!/usr/bin/python3
import argparse
import os
import argcomplete
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument("directory_path",
help="a path to some directory",
nargs=1)
# conditional choices of an argument
conditional_choices = [os.listdir(parser.parse_known_args()[0].directory_path[0])]
parser.add_argument("files",
metavar="FILES",
nargs='+',
choices=conditional_choices)
argcomplete.autocomplete(parser)
args = parser.parse_args()
print("directory_path {}".format(args.directory_path))
print("files {}".format(args.files))
因此 files 参数取决于 directory_path 参数。
使用:Python3.8
问题
对于上面的代码片段,bash-completion(从 register-python-argcomplete3 构建)用于 files 参数无效。
如果我在有效命令(带有路径和文件)之后按回车键,则会出现错误
error: argument FILES: invalid choice: ...
首先值得在 argcomplete documentation 中迈出一步,我在此基础上创建了一个解决方案
#!/usr/bin/python3
# PYTHON_ARGCOMPLETE_OK
import argparse
import os
import argcomplete
def files_names(prefix, parsed_args, **kwargs):
absolute_pat = os.path.abspath(parsed_args.directory_path[0])
files = [file for file in os.listdir(absolute_pat) if os.path.isfile(os.path.join(absolute_pat, file))]
return files
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument("directory_path",
help="a path to some directory",
nargs=1)
parser.add_argument("files",
metavar="FILES",
nargs='+').completer = files_names
argcomplete.autocomplete(parser)
args = parser.parse_args()
print("directory_path {}".format(args.directory_path))
print("files {}".format(args.files))
*使用 argcomplete 测试目录中的 snippet
要调试完成,您可以在 shell 中设置 _ARC_DEBUG 变量以启用详细调试输出
我想创建一个脚本,它带有两个应该使用的参数:
- directory_path,
- files -- directory_path参数下的文件列表。
我写过类似的东西:
#!/usr/bin/python3
import argparse
import os
import argcomplete
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument("directory_path",
help="a path to some directory",
nargs=1)
# conditional choices of an argument
conditional_choices = [os.listdir(parser.parse_known_args()[0].directory_path[0])]
parser.add_argument("files",
metavar="FILES",
nargs='+',
choices=conditional_choices)
argcomplete.autocomplete(parser)
args = parser.parse_args()
print("directory_path {}".format(args.directory_path))
print("files {}".format(args.files))
因此 files 参数取决于 directory_path 参数。
使用:Python3.8
问题
对于上面的代码片段,bash-completion(从 register-python-argcomplete3 构建)用于 files 参数无效。 如果我在有效命令(带有路径和文件)之后按回车键,则会出现错误
error: argument FILES: invalid choice: ...
首先值得在 argcomplete documentation 中迈出一步,我在此基础上创建了一个解决方案
#!/usr/bin/python3
# PYTHON_ARGCOMPLETE_OK
import argparse
import os
import argcomplete
def files_names(prefix, parsed_args, **kwargs):
absolute_pat = os.path.abspath(parsed_args.directory_path[0])
files = [file for file in os.listdir(absolute_pat) if os.path.isfile(os.path.join(absolute_pat, file))]
return files
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument("directory_path",
help="a path to some directory",
nargs=1)
parser.add_argument("files",
metavar="FILES",
nargs='+').completer = files_names
argcomplete.autocomplete(parser)
args = parser.parse_args()
print("directory_path {}".format(args.directory_path))
print("files {}".format(args.files))
*使用 argcomplete 测试目录中的 snippet
要调试完成,您可以在 shell 中设置 _ARC_DEBUG 变量以启用详细调试输出