在python脚本中启动一个shell命令,等待终止并返回到脚本

我有一个python脚本必须启动一个shell命令为每个文件在目录中:

import os files = os.listdir(".") for f in files: os.execlp("myscript", "myscript", f) 

这对第一个文件工作正常,但在“myscript”命令结束后,执行停止,不会回到python脚本。

我能怎么做? 在calling os.execlp()之前,我必须fork() calling os.execlp()吗?

subprocess: subprocess进程模块允许你产生新的进程,连接到他们的input/输出/错误pipe道,并获得他们的返回代码。

http://docs.python.org/library/subprocess.html

用法:

 import subprocess process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE) process.wait() print process.returncode 

你可以使用subprocess.Popen 。 有几种方法可以做到这一点:

 import subprocess cmd = ['/run/myscript', '--arg', 'value'] p = subprocess.Popen(cmd, stdout=subprocess.PIPE) for line in p.stdout: print line p.wait() print p.returncode 

或者,如果你不关心外部程序实际上做了什么:

 cmd = ['/run/myscript', '--arg', 'value'] subprocess.Popen(cmd).wait() 

自2008年以来,subprocess模块已经出现。特别是check_callcheck_output使得简单的子check_output更容易。 check_*系列函数很好,它会在出现错误时引发exception。

 import os import subprocess files = os.listdir('.') for f in files: subprocess.check_call( [ 'myscript', f ] ) 

任何由myscript生成的输出都将显示为您的进程生成输出(技术上的myscript和您的python脚本共享相同的stdout)。 有几种方法可以避免这种情况。

  • check_call( [ 'myscript', f ], stdout=subprocess.PIPE )
    标准输出将被压制(注意如果myscript产生更多的4k输出)。 除非添加stderr=subprocess.PIPE选项,否则stderr仍将显示。
  • check_output( [ 'myscript', f ] )
    check_output将stdout作为一个string返回,所以不显示。 除非添加stderr=subprocess.STDOUT选项,否则stderr仍会显示。

os.exec*()函数新的程序replace当前的程序。 当这个程序结束时,你的过程也是如此。 你可能想要os.system()

使用产卵

 import os os.spawnlp(os.P_WAIT, 'cp', 'cp', 'index.html', '/dev/null')