我正在设计一些代码来获取文件,对其执行dos2unix命令,然后将该文件复制到名为INPUT的文件中,然后运行一个启动程序的命令。从我的代码开始,前两个任务完美无缺,但是脚本似乎并没有超出启动程序的命令行。但是,当我完全按照我在脚本中编写的命令行,并在终端中传递它时,它工作正常。
这是代码:
import subprocess
import os
os.chdir('/home/mike/testing/crystal')
subprocess.Popen(['dos2unix mgo_input'], stdout=subprocess.PIPE, shell=True)
subprocess.call(['cp mgo_input INPUT'], shell=True)
subprocess.Popen(['mpirun -np 8 Pcrystal </dev/null &> mgo_singlepoint.out &'], stdout=subprocess.PIPE, shell=True)
代码的mpirun部分似乎挂断了
答案 0 :(得分:0)
Popen()在被调用程序完成执行之前返回。使用call(或check_call,它检查返回代码)可能是一个更好的解决方案。更好的是,使用python进行转换和复制。
我不确定你为什么要管道stdout,但我会假设你不想让dos2unix或mpirun打印到屏幕上,所以我将它们重定向到/ dev / null。
import subprocess
import shutil
import os
os.chdir('/home/mike/testing/crystal')
subprocess.check_call('dos2unix mgo_input', stdout=open('/dev/null','w'), shell=True)
shutil.copy2(mgo_input, 'INPUT')
subprocess.check_call('mpirun -np 8 Pcrystal', stdout=open('mgo_singlepoint.out', 'w'), stdstderr=subprocess.STDOUT, shell=True)