我正在尝试从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)中运行的命令。

10-07 19:00