十七、subprocess 模块 - 调用命令模块

一、call 直接执行命令

     直接执行命令,返回状态码

1 import subprocess
2 #直接执行系统命令
3 t = subprocess.call('ipconfig')
4 print(t)

 

二、check_call

   执行命令,如果状态是0,返回 否则报错

1 import subprocess
2 #直接执行系统命令. 如果状态码是0,则返回,否则报错
3 t = subprocess.check_call('ipconfig')
4 print(t)

 

三、check_output

  执行命令,如果执行成功,给出返回信息。 否则报错

1 t = subprocess.check_output('ipconfig')
2 print(type(t))

 

四、如果命令是拼接命令

 1 import subprocess
 2 #直接执行系统命令. 如果状态码是0,则返回,否则报错
 3 
 4 # shell 为True表示传递的命令为一个字符串。
 5 # shell为False 表示传递的名称为一个列表,是多个命令
 6 ret = subprocess.call(["ls", "-l"], shell=False)
 7 
 8 subprocess.check_call(["ls", "-l"], shell = False)
 9 
10 subprocess.check_output(["echo", "Hello World!"],shell = 'Flse')

 

五、subprocess.Popen(...)

 摘抄老师博客

subprocess.Popen(...)

用于执行复杂的系统命令

参数:

    • args:shell命令,可以是字符串或者序列类型(如:list,元组)
    • bufsize:指定缓冲。0 无缓冲,1 行缓冲,其他 缓冲区大小,负值 系统缓冲
    • stdin, stdout, stderr:分别表示程序的标准输入、输出、错误句柄
    • preexec_fn:只在Unix平台下有效,用于指定一个可执行对象(callable object),它将在子进程运行之前被调用
    • close_sfs:在windows平台下,如果close_fds被设置为True,则新创建的子进程将不会继承父进程的输入、输出、错误管道。
      所以不能将close_fds设置为True同时重定向子进程的标准输入、输出与错误(stdin, stdout, stderr)。
    • shell:同上
    • cwd:用于设置子进程的当前目录
    • env:用于指定子进程的环境变量。如果env = None,子进程的环境变量将从父进程中继承。
    • universal_newlines:不同系统的换行符不同,True -> 同意使用 \n
    • startupinfo与createionflags只在windows下有效
      将被传递给底层的CreateProcess()函数,用于设置子进程的一些属性,如:主窗口的外观,进程的优先级等等

      简单执行

  • 1 import subprocess
    2 
    3 r1 = subprocess.Popen(["mkdir","t1"])
    4 r2 = subprocess.Popen("mkdir t2", shell = True)

     

  • 复杂执行1 :直接执行命令。 不需要在等待输入其他内容
  • 1 import subprocess
    2 
    3 r2 = subprocess.Popen("mkdir t2", shell = True,cwd = '/home/test/')

     

  • 负责执行2:进入等待状态,需要输入其他内容
  •  1 import subprocess
     2 
     3 obj = subprocess.Popen(['python'],stdin = subprocess.PIPE,stderr = subprocess.PIPE, stdout = subprocess.PIPE, universal_newlines = True)
     4 
     5 obj.stdin.write('print(1)\n')
     6 obj.stdin.write('print(2)')
     7 obj.stdin.close()
     8 
     9 cmd_out = obj.stdout.read()
    10 obj.stdout.close()
    11 cmd_error = obj.stderr.read()
    12 obj.stderr.close()
    13 
    14 # out_error_list = obj1.communicate()
    15 # print(out_error_list)
    16 
    17 print(cmd_out)

     

  •  

  • 可以用communicate 代替
  •  1 import subprocess
     2 
     3 obj = subprocess.Popen(['python'],stdin = subprocess.PIPE,stderr = subprocess.PIPE, stdout = subprocess.PIPE, universal_newlines = True)
     4 
     5 obj.stdin.write('print(1)\n')
     6 obj.stdin.write('print(2)')
     7 obj.stdin.close()
     8 #
     9 # cmd_out = obj.stdout.read()
    10 # obj.stdout.close()
    11 # cmd_error = obj.stderr.read()
    12 # obj.stderr.close()
    13 
    14 out_error_list = obj.communicate()
    15 print(out_error_list)

     

  • 如果是单独的一条命令,可以直接在communicate 内完成
  • 1 import subprocess
    2 
    3 obj = subprocess.Popen(['python'],stdin = subprocess.PIPE,stderr = subprocess.PIPE, stdout = subprocess.PIPE, universal_newlines = True)
    4 
    5 
    6 out_error_list = obj.communicate('print("hello world")')
    7 print(out_error_list)

     

posted @ 2016-06-16 21:48  咖啡茶  阅读(134)  评论(0)    收藏  举报