【问题标题】:python3 argparse autocomplete failpython3 argparse自动完成失败
【发布时间】:2017-08-23 21:42:26
【问题描述】:

我在 python3 中使用 arparse 时发现了一些奇怪的东西。

#!/usr/bin/env python3

import argparse

def create_parser():
    p = argparse.ArgumentParser(add_help=True)
    p.add_argument('-i', help='i parameter', required=True)
    p.add_argument('-m', help='m parameter', required=True)
    return p

if __name__ == '__main__':
    p = create_parser()
    n = p.parse_args()
    print(n)

当我尝试启动它时

python3 ./script.py -i ./some_folder/some_file -m ./

bash 自动完成功能可与“-i”参数一起使用,但不能与“-m”一起使用。例如,如果我将“-m”重命名为“-me”,一切正常。

在 bash 中,我尝试使用“-m”参数启动其他命令,但它不仅适用于 argparse。这里哪里有错误?

【问题讨论】:

  • 可能特定于您的bash,对我有用。你在用argcomplete.readthedocs.io这样的东西吗?或者您的 bash 是否尝试自动完成不是文件名的 python 本身的“模块脚本”-m 参数?
  • 我想到了 python '-m' 参数,但它也有 -i 参数,并且它有效))不是吗?我像在代码示例中一样使用它。但我尝试使用 'chmod +x' 使其可执行并且一切正常))
  • 它被完全解释为python3的'-m'参数,就像'-c'参数。这两个参数不仅仅是一个“标志”。因此,对于使用此参数名称的自动完成工作,需要使脚本可执行。

标签: bash python-3.x argparse


【解决方案1】:

这里发生的是python3 命令的自动补全:

$ complete | grep python
complete -F _python python2
complete -F _python python3
complete -F _python python

处理它的函数_python 应该如下所示:

$ type _python
_python is a function
_python () 
{ 
    local cur prev words cword;
    _init_completion || return;
    case $prev in 
        -'?' | -h | --help | -V | --version | -c)
            return 0
        ;;
        -m)
            _python_modules "$1";
            return 0
        ;;
        -Q)
            COMPREPLY=($( compgen -W "old new warn warnall" -- "$cur" ));
            return 0
        ;;
        -W)
            COMPREPLY=($( compgen -W "ignore default all module once error"                 -- "$cur" ));
            return 0
        ;;
        !(?(*/)python*([0-9.])|-?))
            [[ $cword -lt 2 || ${words[cword-2]} != -@(Q|W) ]] && _filedir
        ;;
    esac;
    local i;
    for ((i=0; i < ${#words[@]}-1; i++ ))
    do
        if [[ ${words[i]} == -c ]]; then
            _filedir;
        fi;
    done;
    if [[ "$cur" != -* ]]; then
        _filedir 'py?([co])';
    else
        COMPREPLY=($( compgen -W '$( _parse_help "$1" -h )' -- "$cur" ));
    fi;
    return 0
}

完成函数将 -m 标志视为与它显示为 python 或脚本的参数相同的标志,因此它尝试使用模块名称列表来完成。

解决此问题的一种方法是为不触发完成的python3 命令使用别名,例如:

$ alias py3=python3

要使其持久化,您可以将其放入您的~/.bashrc。然后就可以使用了

$ py3 ./script.py -i ./some_folder/some_file -m ./[TAB]

这将使用文件名完成。

或将-m 标志重命名为其他名称。

【讨论】:

  • 是的,我已经发现了这一点。没有你详细,但我明白:)
猜你喜欢
  • 2011-10-06
  • 2021-05-31
  • 1970-01-01
  • 1970-01-01
  • 2011-04-10
  • 1970-01-01
  • 2014-01-04
  • 1970-01-01
  • 2012-04-04
相关资源
最近更新 更多