用GNU Parallel替代xargs -n 1管道
我有一个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
来实现并行处理。