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):