我正在使用python' argparse
为我的软件中的常用功能创建命令行绑定。更具体地说,我在谈论this function。
通常当我希望CLI函数在bash中获取输入列表时,我可以执行以下操作:
whateverfunction DSC_4{322..399}*
将所有值从DSC_4322
传递给DSC_4399
,并带有任何后缀。现在,显而易见,如果我只是传递argparse
意味着在python中抓取路径的刺痛,这将无法工作:
parser.add_argument("destination", help="Path to store files into (excluding alphanumeric storage directories)", type=str)
是否有任何优雅的方法允许argparse
位置参数处理机器人路径和文件列表?
我唯一能想到的就是检测字符串中的荣誉并编写一个python脚本,为这样的输入生成一个列表 - 并为任何其他类型的输入执行树爬行......但我希望在那里可能是一个更好的方式。
答案 0 :(得分:2)
所以用一个简单的脚本回显sys.argv
1959:~/mypy$ python echoargv.py stack{342..344}*
['echoargv.py', 'stack34234965.py', 'stack34279750.py', 'stack34308904.py', 'stack34432056.py']
我得到一个文件名列表
parser.add_argument("filenames", nargs='*')
将生成args
名称空间,如:
Namepace(filenames=['echoargv.py', 'stack34234965.py', 'stack34279750.py', 'stack34308904.py', 'stack34432056.py'])
如果没有匹配,我会得到一个像
这样的列表python echoargv.py stack{23..24}*
['echoargv.py', 'stack23*', 'stack24*']
如果要从Python脚本中生成文件列表,请考虑使用glob.glob
。
In [137]: glob.glob('stack342*')
Out[137]: ['stack34234965.py', 'stack34279750.py']
(尽管它显然没有实现{..}
语法。)