《运维--PlayBook》更新中.......!请访问: https://ops.cnmysql.com

Python Subprocess模块 不指定

kangyang , 2014/08/13 18:10 , Python , 评论(0) , 阅读(3525) , Via 本站原创
最近接到一个需求…自动发布SVN代码…收到的代码原型大部分就是依靠subprocess 来实现的,册那…有一段时间没有用这个模块了,这个模块的能力不差,不过我已经习惯了 commands … 再复杂点有fabric也够用啦…既然要了解代码,我不得不看看subprocess ,借此机会 记录下…

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创建自己的控制台窗口

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"])

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


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)
分页: 1/1 第一页 1 最后页 [ 显示模式: 摘要 | 列表 ]