我正在尝试从python文件运行外壳程序代码,以将另一个python文件提交给计算集群。外壳代码如下:
#BSUB -J Proc[1]
#BSUB -e ~/logs/proc.%I.%J.err
#BSUB -o ~/logs/proc.%I.%J.out
#BSUB -R "span[hosts=1]"
#BSUB -n 1
python main.py
但是当我像下面那样从python运行它时,我无法使它工作:
from os import system
system('bsub -n 1 < #BSUB -J Proc[1];#BSUB -e ~/logs/proc.%I.%J.err;#BSUB -o ~/logs/proc.%I.%J.out;#BSUB -R "span[hosts=1]";#BSUB -n 1;python main.py')
我在这里做错什么了吗?
最佳答案
如果我理解正确,则所有#BSUB
内容都是文本,应将其作为输入输入到bsub
命令中。 bsub
在本地运行,然后在计算节点上为您运行这些命令。
在这种情况下,您不能只做:
bsub -n 1 < #BSUB -J Proc[1];#BSUB -e ~/logs/proc.%I.%J.err;#BSUB -o ~/logs/proc.%I.%J.out;#BSUB -R "span[hosts=1]";#BSUB -n 1;python main.py
外壳程序将其解释为“运行
bsub -n 1
并从名为OH CRAP的文件中读取注释已开始,现在我们没有要读取的文件!”您可以使用MOAR HACKERY(使用
echo
或此处的字符串获取对Shell执行的更多不必要依赖)来解决此问题。但是,如果要提供stdin
输入,最好的解决方案是使用功能更强大的工具the subprocess
module:# Open a process (no shell wrapper) that we can feed stdin to
proc = subprocess.Popen(['bsub', '-n', '1'], stdin=subprocess.PIPE)
# Feed the command series you needed to stdin, then wait for process to complete
# Per Michael Closson, can't use semi-colons, bsub requires newlines
proc.communicate(b'''#BSUB -J Proc[1]
#BSUB -e ~/logs/proc.%I.%J.err
#BSUB -o ~/logs/proc.%I.%J.out
#BSUB -R "span[hosts=1]"
#BSUB -n 1
python main.py
''')
# Assuming the exit code is meaningful, check it here
if proc.returncode != 0:
# Handle a failed process launch here
这完全避免了shell启动(完全消除了需要处理注释字符的问题,以及处理shell元字符的所有其他问题),并且显着更清楚地说明了本地运行的内容(
bsub -n 1
)和哪些内容是在bsub
会话(stdin
)中运行的命令。