预警,问题可能更多是因为缺乏对bsub
命令和登录shell的理解而不是python的Popen()
。
我正在尝试使用subprocess.Popen()
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
我我正在使用。有没有办法打印这条路?
答案 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'))