如何argparse在Python脚本中使用shell选项卡完成协作?
#!/usr/bin/env python
import argparse
def main(**args):
pass
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('positional', choices=['spam', 'eggs'])
parser.add_argument('--optional', choices=['foo1', 'foo2', 'bar'])
args = parser.parse_args()
main(**vars(args))
Run Code Online (Sandbox Code Playgroud)
在.py文件上设置可执行标志后,预期结果应为:
$ ./example.py sp<tab>
-> completes to "./example.py spam"
$ ./example.py --op<tab>
-> completes to "./example.py --optional"
$ ./example.py --optional b<tab>
-> completes to "./example.py --optional bar"
$ ./example.py --optional f<tab>
-> completes to "./example.py --optional foo"
and, additionally, prints "foo1 foo2" choices on stdout on a new line
Run Code Online (Sandbox Code Playgroud) 我已经测试过optcomplete使用该optparse模块.它的例子是一个简单的文件,所以我可以让它工作.我也使用该argparse模块对其进行了测试,因为之前的模块已被弃用.但我真的不明白python程序是如何以及由谁在tab press上调用的.我怀疑bash与shebang线和argparse(或optparse)模块一起涉及某种方式.我一直试图解决这个问题(现在要阅读源代码).
我有一个更复杂的程序结构,其中包含处理参数的代码片段的包装器.它的argparse.ArgumentParser()实例化和调用add_argument()- 它被超级映射到另一个中间模块以避免重复代码,以及被调用的包装 - 在函数内部.
我想了解这个标签完成在bash和python之间的工作方式(或者就任何其他解释器而言perl).
注意:我对bash完成有一个公平的理解(我刚刚学到了),我想我理解bash(仅)自定义完成.
注意:我已经阅读了其他类似的SO问题,并且没有人真正回答这个问题.
编辑:这是bash函数.
我已经理解了python模块如何通过读取os.environ变量值 来了解在命令行中输入的单词
$COMP_WORDS
$COMP_CWORD
$COMP_LINE
$COMP_POINT
$COMPREPLY
Run Code Online (Sandbox Code Playgroud)
这些变量仅在按Tab键上具有值.我的问题是如何触发python模块?
我注意到,如果使用argparse参数,bash选项卡完成返回的文件较少.我该如何更改/控制?
最小的示例代码
me@here:~/test$ cat argparsetest.py
import argparse
parser.add_argument('-i', help='input', required=True)
Run Code Online (Sandbox Code Playgroud)
bash完成示例:
# shows all the files
me@here:~/test$ python argparsetest.py
argparsetest.py result.png u1.py
# does not show the image result.png I am actually interested in
me@here:~/test$ python argparsetest.py -i
argparsetest.py u1.py
Run Code Online (Sandbox Code Playgroud)
已经有两个类似的问题,但我没有发现它们有用.