Bash python3 argparse自动完成失败

Bash python3 argparse自动完成失败,bash,python-3.x,argparse,Bash,Python 3.x,Argparse,当我在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', re

当我在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 autocomplete可以使用'-i'参数,但不能使用'-m'。例如,如果我将'-m'重命名为'-me',一切都很好


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

这里发生的是
python3
comand的自动完成:

$complete| grep python
完整-F_python python2
完成-F_python3
complete-F_python
处理它的函数
\u python
应该如下所示:

$type\u python
_python是一个函数
_python()
{ 
本地cur-prev-words cword;
_初始完成返回;
案例$prev in
-“?”|-h |--help |-V |--version |-c)
返回0
;;
-m)
_python_模块“$1”;
返回0
;;
-Q)
COMPREPLY=($(compgen-W“新旧警告警告所有”--“$cur”);
返回0
;;
-W)
COMPREPLY=($(compgen-W“忽略默认所有模块一次错误”--“$cur”);
返回0
;;
!(?(*/)python*([0-9.])|-?)
[cword-lt 2 |${words[cword-2]}!=-@(Q | W)]]&&&U filedir
;;
以撒;
本地i;
for((i=0;i<${单词[@]}-1;i++)
做
如果[${words[i]}==-c]],则
_filedir;
fi;
完成;
如果[[“$cur”!=-*];则
_filedir'py?([co]);
其他的
COMPREPLY=($(compgen-W'$(解析帮助“$1”-h)-“$cur”);
fi;
返回0
}
completion函数将
-m
标记视为python或脚本的参数,因此它尝试使用模块名称列表来完成

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

$alias py3=python3
要使其持久化,可以将其放入
~/.bashrc
中。然后你可以用

$py3./script.py-i./some_文件夹/some_文件-m./[TAB]
将使用文件名完成


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

这里发生的是
python3
comand的自动完成:

$complete| grep python
完整-F_python python2
完成-F_python3
complete-F_python
处理它的函数
\u python
应该如下所示:

$type\u python
_python是一个函数
_python()
{ 
本地cur-prev-words cword;
_初始完成返回;
案例$prev in
-“?”|-h |--help |-V |--version |-c)
返回0
;;
-m)
_python_模块“$1”;
返回0
;;
-Q)
COMPREPLY=($(compgen-W“新旧警告警告所有”--“$cur”);
返回0
;;
-W)
COMPREPLY=($(compgen-W“忽略默认所有模块一次错误”--“$cur”);
返回0
;;
!(?(*/)python*([0-9.])|-?)
[cword-lt 2 |${words[cword-2]}!=-@(Q | W)]]&&&U filedir
;;
以撒;
本地i;
for((i=0;i<${单词[@]}-1;i++)
做
如果[${words[i]}==-c]],则
_filedir;
fi;
完成;
如果[[“$cur”!=-*];则
_filedir'py?([co]);
其他的
COMPREPLY=($(compgen-W'$(解析帮助“$1”-h)-“$cur”);
fi;
返回0
}
completion函数将
-m
标记视为python或脚本的参数,因此它尝试使用模块名称列表来完成

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

$alias py3=python3
要使其持久化,可以将其放入
~/.bashrc
中。然后你可以用

$py3./script.py-i./some_文件夹/some_文件-m./[TAB]
将使用文件名完成


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

可能是特定于您的
bash
的标志,对我有用。你在用这样的东西吗?或者您的bash是否尝试自动完成python本身的'module script'
-m
参数,该参数不是文件名?我想python'-m'参数,但它也有-i参数,并且可以工作。)否?我在代码示例中使用它。但是我尝试使用'chmod+x'使其可执行(所有的工作都是如此)),它被准确地解释为python3的'-m'参数,就像'-c'参数一样。这两个参数不仅仅是一个“标志”。因此,对于使用此参数的自动完成工作,名称需要使脚本可执行。可能某些特定于您的
bash
,适合我。你在用这样的东西吗?或者您的bash是否尝试自动完成python本身的'module script'
-m
参数,该参数不是文件名?我想python'-m'参数,但它也有-i参数,并且可以工作。)否?我在代码示例中使用它。但是我尝试使用'chmod+x'使其可执行(所有的工作都是如此)),它被准确地解释为python3的'-m'参数,就像'-c'参数一样。这两个参数不仅仅是一个“标志”。因此,对于使用此参数的自动完成工作,名称需要使脚本可执行。是的,我已经发现了这一点。没有你说得那么详细,但我明白了:)是的,我已经知道了。没有你详细,但我明白:)