用于在多个输入上运行程序的工具
项目描述
Each是一个用于运行健壮、并行、带有良好反馈机制的for循环的shell命令。
它针对“中等规模”的实验进行了优化,这些实验规模太小且过于临时,无法在适当的集群上运行(或者也许您根本就没有适当的集群。我没有),但足够慢,以至于从头开始重新启动它们会非常痛苦,理想情况下,并行性足够高,如果您恰好有一个十六核心的服务器可以运行它们,您真的希望使用所有十六个核心。
each的主要用途是以下bash for循环的一个更健壮的版本
for f in "$source"/* ; do
DEST="$destination"/$(basename $f)
mkdir -p "$DEST"
"$command" < "$f" > "$DEST/out" 2> "$DEST/err"
echo $? > "$DEST/status"
done
这同样可以用each写成如下
each "$source" "$command" --destination="$destination"
除了更短、更易读外,使用each编写此代码还能得到
自动并行化。您可以使用--processes=n来控制运行多少个进程,但默认情况下将使用除了一个之外的所有可用核心(或在单核机器上的一个核心)。
自动恢复 - 如果each崩溃,当它下次启动时,它将从上次停止的地方恢复。
进度反馈,以及关于进程何时完成的良好预测分析(仍在进行中,但基本功能已经实现)。
稍后您还将获得良好的错误重试逻辑,但我还没有编写这部分。
each还处于早期阶段,因此可能有一些粗糙的边缘,但它经过良好测试,并且已经使我的生活大大改善。
用法
用法如下
each some-input-directory 'some command to run' --destination="output directory"
命令可以是任意shell命令(默认情况下将通过$SHELL -c '要运行的一些命令'来运行)。
默认情况下,文件的内容将被传递到子进程的stdin。如果您想按名称传递文件,可以使用特殊字符串{}。如果您这样做,要处理的文件将被替换(使用其绝对路径名),而stdin将为空。
更高级的用法选项可在每个 --help 中找到。
常见问题解答
为什么?
我有许多实验,基本上是“在每个这些文件上运行这个长时间运行的任务”,任务有不同程度的不可靠性,而我总是发现自己写出不好的版本,所以我决定一次性解决这个问题。
与bash循环版本相比的主要特点
你不会冒学习更多bash的风险。
如果你将其终止,它会从上次停止的地方继续。
自动并行处理
你将获得一个酷炫的进度条。
当我开始编写更好的重试功能时,你将免费获得这些功能。
我该如何安装它?
pip install each
它运行在什么平台上?
可能是在任何类Unix平台上。我已在Linux(包括WSL,Windows 10 Linux子系统)上开发和测试过它,但它可能在未修改的情况下在OSX上运行。它不太可能在Windows上运行。我不反对有人贡献Windows支持,但我不打算自己编写,这是一个相当类Unix的工具。
我应该使用这个吗?
嗯,可能吧。我发现它非常有帮助,但可能非常符合我的使用习惯。
如果你尝试它但不起作用,请提交一个问题或提交一个PR。我很高兴它对大家都有用,但我不会投入大量时间来支持它。
你会使其在Python 2上运行吗?
不会。
你会以更宽松的许可证发布它吗?
也不会。
我不喜欢这些答案。我应该使用什么替代方案?
我不知道。也许bashreduce?
项目详情
each-0.0.6.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 52acb937c53e99131ee4aeb93b41a1c0266dd930bce9ab8e1acdd111ee7ea761 |
|
MD5 | 8a905d7c86237974a1f8ae04a46738b2 |
|
BLAKE2b-256 | dce5394d1cae938919f8d1da353383c54d5e77d8ba364a0b90ad0fd03e70991a |