通过python提交LSF脚本子流程.Popen()无外壳=Tru

2024-06-16 10:37:06 发布

您现在位置:Python中文网/ 问答频道 /正文

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


我试图在python脚本中使用subprocess.Popen()提交一个LSF脚本

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

似乎一个子进程已经正确启动并执行了该命令,但是我从bsub命令中得到了一个错误stderr,它显示“Empty job”。作业未提交。“

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

^{pr2}$

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


我试过使用一些bsub options,比如

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

同样的“空工作”。作业未提交。”返回错误。我觉得这很接近我想要的,但是我不完全理解“登录shell的名称(必须指定一个绝对路径)”到底是什么。可能我正在使用的系统上没有/bin/sh。有办法打印这个路径吗?在


Tags: 命令脚本stderrstdout作业scriptshellsplit
1条回答
网友
1楼 · 发布于 2024-06-16 10:37:06

<>不是命令的参数(在本例中是bsub),而是对shell的指示,说明在该命令启动之前stdin或stdout(分别)应指向何处。在

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

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

相关问题 更多 >