在GNU Parallel中启用/禁用二进制标志的实现方法
使用GNU Parallel生成带二进制标志的脚本调用
需求背景
现有Python脚本sample.py,支持两个命令行选项:
--seed:必须传入整数参数--something:无参数的二进制开关标志
需要通过GNU Parallel自动生成以下6条调用命令:
python sample.py --seed 1111 python sample.py --seed 1111 --something python sample.py --seed 2222 python sample.py --seed 2222 --something python sample.py --seed 3333 python sample.py --seed 3333 --something
尝试过的无效命令
曾尝试以下几种写法,但均未达到预期效果:
parallel python sample.py --seed {1} {2} ::: 1111 2222 3333 ::: "" --something parallel python sample.py --seed {1} {2} ::: 1111 2222 3333 ::: '' --something parallel python sample.py --seed {1} {2} ::: 1111 2222 3333 ::: \ --something
可行解决方案
方法1:利用Shell参数展开精准控制标志
通过第二个参数的非空性来决定是否添加--something,命令如下:
parallel 'python sample.py --seed $1 ${2:+--something}' ::: 1111 2222 3333 ::: '' 1
其中${2:+--something}是Shell的参数展开语法:当$2不为空时,替换为--something;当$2为空时,不输出任何内容。这种方式能精准生成目标命令,避免空参数的Shell解析问题。
方法2:直接使用空字符串生成笛卡尔积
如果你的Shell或GNU Parallel能正确处理空参数(可先用--dry-run验证),可以直接使用笛卡尔积方式:
# 先验证生成的命令是否符合预期 parallel --dry-run python sample.py --seed {1} {2} ::: 1111 2222 3333 ::: '' --something # 确认无误后执行 parallel python sample.py --seed {1} {2} ::: 1111 2222 3333 ::: '' --something
这里的空字符串参数会被Shell忽略,最终生成的命令正好是你需要的形式。
方法3:拆分两次并行调用(直观易理解)
如果上述方法存在兼容性问题,也可以拆分成两个独立的Parallel命令,分别处理两种场景:
# 执行不带--something的调用 parallel python sample.py --seed {} ::: 1111 2222 3333 # 执行带--something的调用 parallel python sample.py --seed {} --something ::: 1111 2222 3333
这种方式逻辑简单,无需复杂语法,适合快速实现需求。
内容的提问来源于stack exchange,提问作者Austin Mordahl
相关产品推荐
相关产品推荐

