如何在Python脚本中与argparse
协作完成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))
如果在.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
要使auto complete工作,您需要一个bash函数来生成可能的选项,然后需要运行
complete -F <function_name> <program_name>
最好的方法是让程序根据自己的解析算法生成完成函数,以避免重复。然而,快速浏览argparse,我找不到访问它内部结构的方法,但我建议您查找它。
下面是一个bash函数,它将用于上述程序:
看看安德烈·基斯利克的argcomplete。
安装时使用:
在调用
parser.parse_args()
之前,导入模块并在源代码中添加一行:为了确保bash知道这个脚本,可以使用
您应该将该行放入
~/.bashrc
中,或者遵循argcomplete的文档并激活“全局”完成。之后你按要求完成工作。
其工作方式是eval行创建一个函数
_python_argcomlete
,该函数使用complete
注册。(运行register-python-argcomplete your_script
来查看哪些被评估为bash)。autocomplete函数查找由bash完成机制设置的环境变量,以查看是否需要执行操作。如果它起作用,它将退出程序。如果它不起作用,这是对程序的正常调用,函数什么也不做,程序的正常流继续。相关问题 更多 >
编程相关推荐