subprocess模块被推荐用来替换一些老的模块和函数,如:os.system、os.spawn*、os.popen*等。真的可以替换吗?
subprocess模块目的是启动一个新的进程并与之通信,最常用是定义类Popen,使用Popen可以创建进程,并与进程进行复杂的交互。
subprocess.Popen
这个模块主要就提供一个类Popen:
class subprocess.Popen( args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0)
这堆东西真让人抓狂:
args |
字符串或者列表 |
bufsize |
0 无缓冲 |
executable |
一般不用吧,args字符串或列表第一项表示程序名 |
stdin |
None 没有任何重定向,继承父进程 |
preexec_fn |
钩子函数, 在fork和exec之间执行。(unix) |
close_fds |
unix 下执行新进程前是否关闭0/1/2之外的文件 |
shell |
为真的话 |
cwd |
设置工作目录 |
env |
设置环境变量 |
universal_newlines |
各种换行符统一处理成 '\n' |
startupinfo |
window下传递给CreateProcess的结构体 |
creationflags |
windows下,传递CREATE_NEW_CONSOLE创建自己的控制台窗口 |
Popen对象
该对象提供有不少方法函数可用。而且前面已经用到了wait()/poll()/communicate()
poll() |
检查是否结束,设置返回值 |
wait() |
等待结束,设置返回值 |
communicate() |
参数是标准输入,返回标准输出和标准出错 |
send_signal() |
发送信号 (主要在unix下有用) |
terminate() |
终止进程,unix对应的SIGTERM信号,windows下调用api函数TerminateProcess() |
kill() |
杀死进程(unix对应SIGKILL信号),windows下同上 |
stdin |
参数中指定PIPE时,有用 |
pid |
进程id |
returncode |
进程返回值 |
Mounttype = p.communicate()[0]
if (Mounttype.find('rw') == -1):