当通过bash命令行将glob表达式作为参数传递给脚本时,它会被展开,并且与之匹配的文件将解压缩到sys.argv
中:
# stuff.py
import sys
print(sys.argv)
host:~$ python stuff.py a*
['stuff.py', 'a1', 'a2', 'a3']
我想将这些文件作为sys.argv
host:~$ python stuff.py a*
['stuff.py', ['a1', 'a2', 'a3']]
我知道将glob表达式放在引号中并使用glob
模块解决了这个问题:
import sys
import glob
print(glob.glob(sys.argv[1]))
host:~$ python stuff.py "a*"
['a1', 'a2', 'a3']
但是,这需要在参数周围添加引号,因此不能直接使用制表符完成。
是否可以阻止扩展命令行参数?
答案 0 :(得分:3)
从bash命令行获取未扩展的参数
传递shell未展开的参数的唯一方法是引用它或使用适当的转义。 具体来说,引用或转义shell试图扩展的部分。
但是,这需要在参数周围添加引号,因此不能直接使用制表符完成。
您不需要在整个参数周围添加引号。 对于在shell中具有特殊含义的字符来说,这就足够了。
例如,如果您自动完成此命令行,直到此时为止:
python stuff.py file_00
^ cursor is here, and you have many files,
for example file_001, file_002, ...
此时,如果要添加文字*
以将file_00*
传递给Python脚本而不用shell解释它,
你可以这样写:
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部分。