用GNU Parallel替代xargs -n 1管道

2 投票
1 回答
863 浏览
提问于 2025-04-18 07:59

我有一个Python脚本,它的唯一参数是一个州的缩写列表,还有一个文本文件,里面包含了所有州的缩写字符串。

正常情况下,我会这样调用这个脚本...

$ mypy.py "AK"

...来运行脚本处理阿拉斯加州。

目前,我使用以下方法来对从我的statelist.txt文件中获取的每个州的缩写运行这个脚本:

$ cat statelist.txt | xargs -n 1 ./mypy.py

现在,我想让这个执行过程并行化,而GNU Parallels看起来是个不错的选择。我从这里看到,这应该是替换xargs -n1的语法:

$ find . -name '*.html' | parallel gzip --best

所以,我的尝试是

$ cat statelist.txt | parallel python mypy.py

还有

$ cat statelist.txt | parallel python mypy.py {}

但是这两种方法都返回了:

/bin/bash: mypy.py: command not found
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'AK' is not defined

看起来它可能是以未加引号的方式传递的?但是当我在'{}'上加上引号时,它又传递了一个字面上的"{}"。

1 个回答

6
cat statelist.txt | parallel --gnu python mypy.py 

如果不加 --gnu,GNU parallel 可能会选择模仿一个旧的同名工具(Tollef 的 parallel)。在很多系统中,--tollef 是默认的行为,这就是为什么你用 GNU 风格的命令却失败的原因。

顺便说一下,你的 xargs 可能也用了 -C-P 来实现并行处理。

撰写回答