在没有 shell=True 的情况下通过 python 的 subprocess.Popen() 提交 LSF 脚本

Submitting an LSF script via python's subprocess.Popen() without shell=True

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


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

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

似乎子进程已正确启动并执行了命令,但我从读取 "Empty job. Job not submitted."

的 bsub 命令中得到 stderr 错误

我担心它与启动登录的子进程有关-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)

返回相同的 "Empty job. Job not submitted." 错误。我觉得这接近我要找的东西,但我不完全理解 "The name of the login shell (must specify an absolute path" 到底是什么。也许它不是 /bin/sh 在我使用的系统上。有没有办法打印这条路径?

<> 不是您命令的参数(在本例中为 bsub),而是对 shell 关于 stdin 或 stdout(分别) 应该在该命令启动之前被引导。

因此,适当的替代方法是使用 Popen 的单独参数指定此重定向:

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