【问题标题】:Running python scripts for different input directory through bash terminal通过 bash 终端为不同的输入目录运行 python 脚本
【发布时间】:2020-12-07 11:50:24
【问题描述】:

我正在尝试使用 bash 通过终端自动执行我的任务。我有一个 python 脚本,它接受两个参数(输入和输出的路径),然后脚本运行并将输出保存在一个文本文件中。

所有输入目录都有一个从“g-”开始的模式,而输出目录保持静态。 所以,我想编写一个可以自己运行的脚本,这样我就不必在数百个目录上手动运行它了。

$ python3 program.py ../g-changing-directory/    ~/static-directory/ > ~/static-directory/final/results.txt

【问题讨论】:

  • 检查任何带有[gnu-parallel]标签的答案

标签: python linux bash unix


【解决方案1】:

你可以这样做:

find .. -maxdepth 1 -type d -name "g-*" | xargs -n1 -P1 -I{} python3 program.py {} ~/static-directory/ >> ~/static-directory/final/results.txt

find .. 将在父目录中查找 -maxdepth 1 将仅在顶级目录中查找并且不获取任何子目录 -type d 仅获取目录 -name "g-*" 获取以 g- 开头的对象(如果您使用 -iname "g-*"想要以g-G- 开头的对象。
我们通过管道将它传递给xargs,它将stdin 的输入应用到指定的命令。 -n1 告诉它每个输入字启动一个进程,-P1 告诉它一次只运行一个进程,-I{} 告诉它用命令中的输入替换 {}
然后我们指定为输入运行的命令,其中{}xargs 替换。:python3 program.py {} ~/static-directory/ >> ~/static-directory/final/results.txt 看看>>,如果文件存在,它将附加到文件中,而> 将覆盖文件(如果存在)。

使用-P4,您可以并行启动四个进程。但是您不想这样做,因为您正在写入一个文件并且多处理可能会弄乱您的输出文件。如果每个进程都写入自己的文件,则可以安全地进行多处理。

请参阅man findman xargs 了解更多详情。

还有很多其他方法可以做到这一点。例如。像这样的循环:

for F in $(ls .. | grep -oP "g-.*"); do 
  python3 program.py $F ~/static-directory/ >> ~/static-directory/final/results.txt
done

【讨论】:

    【解决方案2】:

    有很多方法可以做到这一点,这是我要写的:

    find .. -type d -name "g-*" -exec python3 program.py {} ~/static-directory/ \; > ~/static-directory/final/results.txt
    

    您没有提到是否要包含嵌套目录,如果答案是否定的,那么您必须像@toydarian 的答案一样添加-maxdepth 参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-04
      • 2019-12-31
      • 1970-01-01
      • 2019-09-16
      • 2019-04-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-08
      相关资源
      最近更新 更多