十七、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)

浙公网安备 33010602011771号