标签:python基础
subprocess模块
该subprocess模块目标启动新的进程,并与之进行通信。
1、Call:执行程序,等待它完成,返回状态码。
import subprocess
ret1 = subprocess.call(["cp ","-p"],shell=True)
ret2 = subprocess.call(["cp","-p"],shell=False)
Shell = True 允许shell是字符串形式。
def call(*popenargs, **kwargs):
return Popen(*popenargs, **kwargs).wait()
2、call_check()调用前面的call()函数,如果返回值非零,则抛出异常。
def check_call(*popenargs, **kwargs):
retcode = call(*popenargs, **kwargs)
if retcode:
cmd = kwargs.get("args")
if cmd is None:
cmd = popenargs[0]
raise CalledProcessError(retcode, cmd)
return 0
3、check_output():执行程序,如果返回码是0,则返回执行结果。
def check_output(*popenargs, **kwargs):
if ‘stdout‘ in kwargs:
raise ValueError(‘stdout argument not allowed, it will be overridden.‘)
process = Popen(stdout=PIPE, *popenargs, **kwargs)
output, unused_err = process.communicate()
retcode = process.poll()
if retcode:
cmd = kwargs.get("args")
if cmd is None:
cmd = popenargs[0]
raise CalledProcessError(retcode, cmd, output=output)
return output
4、subprocess还提供了非常重要的类Popen:执行复杂的系统命令。
class Popen(object):
def __init__(self, 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 | shell命令可以是字符串或者列表 |
bufsize | 0 无缓冲,1 行缓冲,其他 缓冲区大小,负值 系统缓冲 |
executable | 一般不用 |
stdin stdout stderr | 标准输出、输出、错误句柄 |
preexec_fn | 只在Unix平台下执行,用于指定一个可执行对象,在子进程执行之前调用 |
close_fds | 在windows平台下,如果close_fds被设置为True,则新创建的子进程将不会继承父进程的输入、输出、错误管道。 所以不能将close_fds设置为True同时重定向子进程的标准输入、输出与错误(stdin, stdout, stderr)。 |
shell | 同上 |
cwd | 用于设置子进程的当前目录 |
env | 用于设置子进程的环境变量 |
universal_newlines | 各种换行符设置成\n |
startupinfo | window下传递给CreateProcess的结构体,只在Windows下有效 |
creationflags | windows下,传递CREATE_NEW_CONSOLE创建自己的控制台窗口,在Windows下有效 |
Popen的方法:
poll() | 检查是否结束,设置返回值 |
wait() | 等待结束,设置返回值 |
communicate() | 参数是标准输入,返回标准输出和错误 |
send_signal() | 发送信号,主要在linux下使用 |
terminate() | 终止信号 |
kill() | 杀死进程 |
PID | 进程id |
returncode | 进程返回值 |
stdin stdout stderr | 参数中指定PIPE时,有用 |
例子:
import subprocess obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) obj.stdin.write(‘print 1 \n ‘) obj.stdin.write(‘print 2 \n ‘) obj.stdin.write(‘print 3 \n ‘) obj.stdin.write(‘print 4 \n ‘) obj.stdin.close() cmd_out = obj.stdout.read() obj.stdout.close() cmd_error = obj.stderr.read() obj.stderr.close() print cmd_out print cmd_error
参考网址:http://www.cnblogs.com/wupeiqi/articles/4963027.html
标签:python基础
原文地址:http://crazyforever.blog.51cto.com/7362974/1733277