Python 从bash命令行获取未展开的参数
当从bash命令行将glob表达式作为参数传递给脚本时,它将被展开,匹配它的文件将被解压到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
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嗯,这不是我所期望的,但是。。。我不得不承认它相当不错。如果我只用一个反斜杠就可以避开星号,疼痛会有所缓解。。。我对此很满意,非常感谢。正如我所评论的,这不是我期望的答案,但这仍然让我感到满意。非常感谢。