如何根据shell查找结果添加argparse标志

时间:2018-01-25 21:37:25

标签: python shell argparse

我有一个接受-f标志的python脚本,并附加了该标志的多次使用。

例如,如果我运行python myscript -f file1.txt -f file2.txt,我会有一个文件列表files=['file1.txt', 'files2.txt']。这很好用,但我想知道如何自动使用find命令的结果来附加与文件一样多的-f标志。

我试过了:

find ./ -iname '*.txt' -print0 | xargs python myscript.py -f

但它只抓取第一个文件

2 个答案:

答案 0 :(得分:2)

需要注意的是,如果有多个文件超出单个命令行,则会失败(而xargs会多次运行myscript.py,每个文件都包含完整参数列表的子集):

#!/usr/bin/env bash

args=( )
while IFS= read -r -d '' name; do
  args+=( -f "$name" )
done < <(find . -iname '*.txt' -print0)

python myscript.py "${args[@]}"

如果您希望以容忍任意数量文件名的方式安全,最好使用长格式选项 - 例如--file而不是-f = - 使用xargs分隔符,允许将单个名称作为同一argv条目的一部分传递,从而防止#!/usr/bin/env bash # This requires -printf, a GNU find extension find . -iname '*.txt' -printf '--file=%p\0' | xargs -0 python myscript.py 将文件名与其前面的符号分开:< / p>

#!/usr/bin/env bash
# requires find -print0 and xargs -0; these extensions are available on BSD as well as GNU
find . -iname '*.txt' -print0 |
  while IFS= read -r -d '' f; do printf '--file=%s\0' "$f"; done |
  xargs -0 python myscript.py

...或者,更便携(在MacOS上运行,虽然仍然需要shell - 例如bash - 可以处理NUL分隔的读取):

<div id="newprofileimg_<xsl:value-of select+"position()"/></div>
<script>
   var width=screen.width;
   var d=document.getElementById("newprofileimg_<xsl:value-of select="position()"/>");

   d.style.backgroundImage="url(/services/resizeimage/<xsl:value-of select="./mediaid"/>/"+width+"/500);";
</script>

答案 1 :(得分:0)

您的标题似乎暗示您可以修改脚本。在这种情况下,使用nargs(args数)选项为-f标志允许更多参数:

parser = argparse.ArgumentParser()
parser.add_argument('--files', '-f', nargs='+')
args = parser.parse_args()
print(args.files)

然后您可以轻松使用find命令:

15:44 $ find . -depth 1 | xargs python args.py -f
['./args.py', './for_clint', './install.sh', './sys_user.json']

否则,如果您无法修改脚本,请参阅@ CharlesDuffy的答案。