将bash文件列表传递给python CLI函数

时间:2016-04-05 00:58:28

标签: python bash argparse

我正在使用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脚本,为这样的输入生成一个列表 - 并为任何其他类型的输入执行树爬行......但我希望在那里可能是一个更好的方式。

1 个答案:

答案 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']

(尽管它显然没有实现{..}语法。)