在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_call
和check_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')