0

我想创建一个脚本,该脚本需要使用两个参数:

  • 目录路径,
  • 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

问题

对于上面的代码片段,files参数的 bash-completion(从register-python-argcomplete3 构建)不起作用。如果我在有效命令(带有路径和文件)之后按回车键,则会出现错误

error: argument FILES: invalid choice: ...
4

1 回答 1

0

首先是我创建解决方案的argcomplete 文档中值得一步

#!/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 测试目录中的完整片段

要调试完成,您可以在 shell 中设置_ARC_DEBUG变量以启用详细调试输出

于 2021-08-02T10:36:57.220 回答