1

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

4

1 回答 1

0

Popen() 在被调用程序完成执行之前返回。使用 call(或 check_call,检查返回码)可能是更好的解决方案。更好的是,使用 python 进行转换和复制。

我不确定你为什么要管道标准输出,但我会假设你不希望 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)
于 2013-07-18T17:50:20.393 回答