《运维--PlayBook》更新中.......!请访问: https://ops.cnmysql.com
最近接到一个需求…自动发布SVN代码…收到的代码原型大部分就是依靠subprocess 来实现的,册那…有一段时间没有用这个模块了,这个模块的能力不差,不过我已经习惯了 commands … 再复杂点有fabric也够用啦…既然要了解代码,我不得不看看subprocess ,借此机会 记录下…
subprocess.Popen(类):
args参数。可以是一个字符串,可以是一个包含程序参数的列表。要执行的程序一般就是这个列表的第一项,或者是字符串本身。
示例:
subprocess.PIPE用于Popen的stdin 、stdout 和stderr 3个参数
subprocess.STDOUT用于Popen的stderr参数的输出值
subprocess.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 无缓冲,1 行缓冲,其他正值 缓冲区大小,负值 采用默认系统缓冲(一般是全缓冲)
executable args字符串或列表第一项表示程序名
stdin,stdout,stderr None 没有任何重定向,继承父进程,PIPE 创建管道,文件对象,文件描述符(整数),stderr 还可以设置为 STDOUT
preexec_fn 只在Unix平台下有效,用于指定一个可执行对象(callable object),它将在子进程运行之前被调用。
close_fds 如果close_fds被设置为True,则新创建的子进程将不会继承父进程的输入、输出、错误管 道。不能将close_fds设置为True同时重定向子进程的标准输入、输出与错误(stdin, stdout, stderr)。
shell 如果为真(unix下相当于args前面添加了 "/bin/sh" "-c"|window下,相当于添加"cmd.exe /c")
cwd 设置工作目录
env 设置环境变量
universal_newlines 各种换行符统一处理成 '\n
startupinfo window下传递给CreateProcess的结构体
creationflags windows下,传递CREATE_NEW_CONSOLE创建自己的控制台窗口
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 无缓冲,1 行缓冲,其他正值 缓冲区大小,负值 采用默认系统缓冲(一般是全缓冲)
executable args字符串或列表第一项表示程序名
stdin,stdout,stderr None 没有任何重定向,继承父进程,PIPE 创建管道,文件对象,文件描述符(整数),stderr 还可以设置为 STDOUT
preexec_fn 只在Unix平台下有效,用于指定一个可执行对象(callable object),它将在子进程运行之前被调用。
close_fds 如果close_fds被设置为True,则新创建的子进程将不会继承父进程的输入、输出、错误管 道。不能将close_fds设置为True同时重定向子进程的标准输入、输出与错误(stdin, stdout, stderr)。
shell 如果为真(unix下相当于args前面添加了 "/bin/sh" "-c"|window下,相当于添加"cmd.exe /c")
cwd 设置工作目录
env 设置环境变量
universal_newlines 各种换行符统一处理成 '\n
startupinfo window下传递给CreateProcess的结构体
creationflags windows下,传递CREATE_NEW_CONSOLE创建自己的控制台窗口
args参数。可以是一个字符串,可以是一个包含程序参数的列表。要执行的程序一般就是这个列表的第一项,或者是字符串本身。
###可以正常工作###
>>> subprocess.Popen(["cat","i-it"])
###不可以正常工作,如果是一整个字符串,则必须是程序的路径才行(因为Unix的API函数是Exec ,接受的是字符串列表)###
>>> subprocess.Popen(["cat i-it"])
###但如果shell = True 就可以工作啦###
>>> subprocess.Popen("cat /root/i-it",shell=True)
----这个相当于----(bash)
>>> subprocess.Popen(["/bin/sh", "-c", "cat i-it"])
>>> subprocess.Popen(["cat","i-it"])
###不可以正常工作,如果是一整个字符串,则必须是程序的路径才行(因为Unix的API函数是Exec ,接受的是字符串列表)###
>>> subprocess.Popen(["cat i-it"])
###但如果shell = True 就可以工作啦###
>>> subprocess.Popen("cat /root/i-it",shell=True)
----这个相当于----(bash)
>>> subprocess.Popen(["/bin/sh", "-c", "cat i-it"])
示例:
import subprocess
def runCommandWithOutput(cmd,stdinstr = ''):
p=subprocess.Popen(cmd, shell=True, universal_newlines=True, stdin=subprocess.PIPE,stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
#p.stdin.write(stdinstr)
stdoutdata, stderrdata = p.communicate(stdinstr)
#p.stdin.close()
return p.returncode, stdoutdata, stderrdata
>>> get = runCommandWithOutput("who")
>>> print get
(0, 'root tty1 2014-06-24 05:51\nroot pts/0 2014-06-24 05:51 (1.1.1.2)\n', None)
def runCommandWithOutput(cmd,stdinstr = ''):
p=subprocess.Popen(cmd, shell=True, universal_newlines=True, stdin=subprocess.PIPE,stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
#p.stdin.write(stdinstr)
stdoutdata, stderrdata = p.communicate(stdinstr)
#p.stdin.close()
return p.returncode, stdoutdata, stderrdata
>>> get = runCommandWithOutput("who")
>>> print get
(0, 'root tty1 2014-06-24 05:51\nroot pts/0 2014-06-24 05:51 (1.1.1.2)\n', None)
subprocess.PIPE用于Popen的stdin 、stdout 和stderr 3个参数
subprocess.STDOUT用于Popen的stderr参数的输出值
###很清晰了###
>>> test = subprocess.Popen("who",shell=True,stdout=subprocess.PIPE)
>>> test.stdout.readlines()
['root tty1 2014-06-24 05:51\n', 'root pts/0 2014-06-24 05:51 (1.1.1.2)\n']
Popen.send_signal(signal)
给子进程发送signal信号。
注意:windows下目前只支持发送SIGTERM,等效于下面的terminate() 。
Popen.terminate()
停止子进程。Posix下是发送SIGTERM信号。windows下是调用TerminateProcess()这个API。
Popen.kill()
杀死子进程。Posix下是发送SIGKILL信号。windows下和terminate() 无异。
Popen.stdin
如果stdin 参数是PIPE,此属性就是一个文件对象,否则为None 。
Popen.stdout
如果stdout参数是PIPE,此属性就是一个文件对象,否则为None 。
Popen.stderr
如果stderr 参数是PIPE,此属性就是一个文件对象,否则为None 。
Popen.pid
子进程的进程号。注意,如果shell 参数为True,这属性指的是子shell的进程号。
>>> test.pid
3367
Popen.returncode
子程序的返回值,由poll()或者wait()设置,间接地也由communicate()设置。
如果为None,表示子进程还没终止。
如果为负数-N的话,表示子进程被N号信号终止。(仅限*nux)
>>> test = subprocess.Popen("who",shell=True,stdout=subprocess.PIPE)
>>> test.stdout.readlines()
['root tty1 2014-06-24 05:51\n', 'root pts/0 2014-06-24 05:51 (1.1.1.2)\n']
Popen.send_signal(signal)
给子进程发送signal信号。
注意:windows下目前只支持发送SIGTERM,等效于下面的terminate() 。
Popen.terminate()
停止子进程。Posix下是发送SIGTERM信号。windows下是调用TerminateProcess()这个API。
Popen.kill()
杀死子进程。Posix下是发送SIGKILL信号。windows下和terminate() 无异。
Popen.stdin
如果stdin 参数是PIPE,此属性就是一个文件对象,否则为None 。
Popen.stdout
如果stdout参数是PIPE,此属性就是一个文件对象,否则为None 。
Popen.stderr
如果stderr 参数是PIPE,此属性就是一个文件对象,否则为None 。
Popen.pid
子进程的进程号。注意,如果shell 参数为True,这属性指的是子shell的进程号。
>>> test.pid
3367
Popen.returncode
子程序的返回值,由poll()或者wait()设置,间接地也由communicate()设置。
如果为None,表示子进程还没终止。
如果为负数-N的话,表示子进程被N号信号终止。(仅限*nux)