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

Pass bash file list to python CLI function

我正在使用 python 的 argparse 为我的软件中的常用功能创建命令行绑定。更具体地说,我说的是 this function.

通常当我希望 CLI 函数获取 bash 中的输入列表时,我可以这样做:

whateverfunction DSC_4{322..399}*

这会将函数从 DSC_4322DSC_4399 的所有值传递给任何后缀。现在,很明显,如果我只是传递一个带 argparse 的刺痛意味着在 python:

中抓取路径,这将不起作用
parser.add_argument("destination", help="Path to store files into (excluding alphanumeric storage directories)", type=str)

是否有任何优雅的方法允许 argparse 位置参数来处理路径和文件列表?

我唯一能想到的就是检测字符串中的赞誉并编写一个 python 脚本来为这样的输入生成一个列表 - 并为任何其他类型的输入执行树爬网.. .但我希望有更好的方法。

所以用一个简单的脚本来回应 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']

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