optparse与bash自动补全的奇怪行为

2 投票
3 回答
624 浏览
提问于 2025-04-15 23:26

我正在为刚接触Linux的用户编写一个脚本,所以请理解我为什么会问这个问题 :)

我的脚本是这样运行的:

python script.py -f filename.txt

我使用了optparse这个模块。不过,在进行自动补全时,我注意到了一些问题。

当我这样做时,自动补全是有效的:

python script.py <tab completion> # Tab completion works normally as expected

但是当我这样做时,自动补全就不管用了:

python script.py -f <tab completion> # No type of tab completion works here.

我真的不希望我的用户手动输入输入文件的名字。自动补全是必须的。我该怎么做才能让它正常工作,或者我哪里做错了呢?

3 个回答

0

如果你希望用户的使用体验更简单一些(也就是说,他们不需要了解命令行是怎么工作的,以及在他们的电脑上可能是如何设置的),那么你的程序应该先整理出一个输入文件的列表,然后把这个列表展示给用户,让他们选择。

1

这段内容是关于bash自动补全的。

你可以先检查一下自己是否有bash_completion脚本,并找找里面有没有关于python的内容。

通常的补全文件在 /etc/bash_completion 这个路径下,你的系统里应该有类似的内容:

if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
    . /etc/bash_completion
fi

在你的.bashrc文件(或者是_profile之类的文件)里。

现在你可以通过添加自己的脚本来重新定义一些行为。可以看看 /etc/bash_completion 文件,获取一些灵感哦。:)

4

这其实跟bash的工作方式有关,而不是跟python本身有关。经过一些实验,发现第二次及之后按TAB键实际上会让bash进行扩展。

编辑: bash之所以只扩展*.py*.pyc文件,很可能是因为这一行的第一个词是python。如果你在python脚本的第一行加上#! /usr/bin/env python,然后用chmod +x script.py命令给脚本加上执行权限,再试试./script.py -f和TAB键补全,这时候会发生什么呢?我猜应该会正常工作。

撰写回答