python中的子进程没有执行命令

时间:2013-07-18 17:38:28

标签: python linux subprocess

我正在设计一些代码来获取文件,对其执行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部分似乎挂断了

1 个答案:

答案 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)