Python 从bash命令行获取未展开的参数

Python 从bash命令行获取未展开的参数,python,bash,command-line,Python,Bash,Command Line,当从bash命令行将glob表达式作为参数传递给脚本时,它将被展开,匹配它的文件将被解压到sys.argv: # stuff.py import sys print(sys.argv) host:~$ python stuff.py a* ['stuff.py', ['a1', 'a2', 'a3']] 我希望将这些文件作为sys.argv的单个元素放在一个容器中: # stuff.py import sys print(sys.argv) host:~$ python stuff.py a

当从bash命令行将glob表达式作为参数传递给脚本时,它将被展开,匹配它的文件将被解压到
sys.argv

# stuff.py
import sys

print(sys.argv)
host:~$ python stuff.py a*
['stuff.py', ['a1', 'a2', 'a3']]
我希望将这些文件作为
sys.argv
的单个元素放在一个容器中:

# stuff.py
import sys

print(sys.argv)
host:~$ python stuff.py a*
['stuff.py', ['a1', 'a2', 'a3']]

我知道将glob表达式置于引号中并使用
glob
模块可以解决问题:

import sys
import glob

print(glob.glob(sys.argv[1]))
但是,这需要在参数周围添加引号,因此不能直接使用制表符完成

是否可以防止命令行参数被扩展

从bash命令行获取未展开的参数

传递shell未展开的参数的唯一方法是引用它或使用适当的转义。 具体来说,引用或转义shell试图扩展的部分

但是,这需要在参数周围添加引号,因此不能直接使用制表符完成

您不需要在整个参数周围添加引号。 在shell中有特殊含义的角色周围这样做就足够了

例如,如果在此点之前自动完成此命令行:

python stuff.py file_00
                       ^ cursor is here, and you have many files,
                         for example file_001, file_002, ...
此时,如果您想添加一个文本
*
,将
文件\u 00*
传递到Python脚本,而不需要shell对其进行解释, 你可以这样写:

python stuff.py file_00\*
python stuff.py file_00'*'
或者像这样:

python stuff.py file_00\*
python stuff.py file_00'*'
再举一个例子, 请注意,当文件模式包含空格时, 选项卡完成将正确添加
\
,例如:

python stuff.py file\ with\ spaces\ 00
在这里,您也可以像往常一样添加转义的
*

python stuff.py file\ with\ spaces\ 00\*
总之,, 您可以自然地使用制表符补全, 并在制表符完成后仅转义特殊字符。
然后使用
glob
Python模块来扩展参数中的glob部分。

我不明白您对
tab
所说的话,以及在使用
glob
Python模块时所缺少的内容。您想要像案例2那样的输出吗?如果是,就不要使用“*”。不,您不能这样做。@Rightleg您不必返回以插入引号。如果自动完成参数直到
文件00
,则可以附加
\*
“*”
。例如,命令行可能看起来像
python stuff.py file\u 00“*”
,传递给python的参数将是
file\u 00*
,而
glob
模块将按原样处理它should@janos嗯,这不是我所期望的,但是。。。我不得不承认它相当不错。如果我只用一个反斜杠就可以避开星号,疼痛会有所缓解。。。我对此很满意,非常感谢。正如我所评论的,这不是我期望的答案,但这仍然让我感到满意。非常感谢。