【问题标题】:Pass bash file list to python CLI function将 bash 文件列表传递给 python CLI 函数
【发布时间】:2016-07-24 17:53:25
【问题描述】:

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

【问题讨论】:

  • 您在寻找nargs='+'吗?
  • 如果您希望 shell 为您扩展文件名,nargs='+' 是正确的方法。如果您希望 python 进行扩展,您需要将规范放在引号中 (whateverfunction "DCS_4{322..399}*),以便 shell 将规范向下传递。
  • argparse 处理您在sys.argv 列表中提供的内容。

标签: python bash argparse


【解决方案1】:

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

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

【讨论】:

  • 好的,这听起来不错 - 它可以作为最后一个位置参数吗?还是它也会捕捉到它后面的关键字参数?它会捕捉到它之前的位置参数吗?
  • 这个nargs 是贪婪的,所以在出现问题后阻止它捕获所有参数。之前的固定长度位置应该不是问题。
猜你喜欢
  • 2016-02-23
  • 1970-01-01
  • 2015-08-31
  • 1970-01-01
  • 1970-01-01
  • 2011-04-27
  • 2021-12-15
  • 2013-07-04
  • 1970-01-01
相关资源
最近更新 更多