通过python的subprocess.Popen()提交LSF脚本,不带shell = True

时间:2017-07-16 23:39:27

标签: python lsf

预警,问题可能更多是因为缺乏对bsub命令和登录shell的理解而不是python的Popen()

我正在尝试使用subprocess.Popen()

在python脚本中提交LSF脚本
pipe = subprocess.Popen(shlex.split("bsub < script.lsf"),
                        stdout=subprocess.PIPE, stderr=subprocess.PIPE)

似乎正在启动子进程并执行了命令,但是我在bsub命令的stderr中收到错误,该命令显示为“空作业。作业未提交。”

我担心这与子进程启动login-shell有关,所以我尝试在Popen命令中使用shell=True来缓解它。

pipe = subprocess.Popen("bsub < script.lsf", shell=True,
                        stdout=subprocess.PIPE, stderr=subprocess.PIPE)

这成功按预期提交作业。所以我的问题是如何在不使用shell=True的情况下提交此作业?

我尝试使用一些bsub options,例如

pipe = subprocess.Popen(shlex.split("bsub -L /bin/sh < script.lsf"),
                        stdout=subprocess.PIPE, stderr=subprocess.PIPE)

使用相同的“空作业。作业未提交”。错误返回。我觉得这很接近我正在寻找的东西,但我还没有完全理解“登录shell的名称(必须指定绝对路径)是完全正确的。也许它不是系统上的/bin/sh我我正在使用。有没有办法打印这条路?

1 个答案:

答案 0 :(得分:3)

<>不是你的命令的参数(在这种情况下是bsub),但是指示shell关于stdin或stdout(分别)应该在那之前指向的地方命令已启动。

因此,适当的替换是使用单独的参数指定此重定向Popen

pipe = subprocess.Popen(['bsub', '-L', '/bin/sh'],
                        stdout=subprocess.PIPE, stderr=subprocess.PIPE,
                        stdin=open('script.lsf', 'r'))