#!/usr/bin/env python # -*- coding:utf-8 -*- # author: Changhua Gong import subprocess ‘‘‘ 1. 推荐使用subprocess模块代替其他模块执行shell命令; 2. call无论是否正确执行都会返回returncode attribute,即使执行命令报错了,后面的语句会继续执行, check_call & check_output执行命令报错后(returncode非0)直接抛出CalledProcessError,后续命令不再执行, 可使用try...except...捕捉; 3. call无论是否正确执行都会返回returncode attribute,即使执行命令报错了,后面的语句会继续执行; 4. check_call:Run command with arguments. Wait for command to complete. If the exit code was zero then return, otherwise raise CalledProcessError. The CalledProcessError object will have the return code in the returncode attribute. check_call要么返回0,要么直接抛出异常CalledProcessError,异常对象里仅有returncode; 5. check_output:Run command with arguments and return its output. If the exit code was non-zero it raises a CalledProcessError. The CalledProcessError object will have the return code in the returncode attribute and output in the output attribute. check_output要么返回直接返回命令运行结果(returncode为0,命令正确执行), 要么直接抛出异常CalledProcessError,异常对象里有returncode和output; ‘‘‘ rs = subprocess.call([ "ipconfig" , "/all" ]) print ( "Exit code: " , rs) # 执行后的返回结果 try : rs = subprocess.check_call([ "dir" , "c:" ]) print ( "Exit code: " , rs) # 执行后的返回结果 except Exception as e: print (e) print ( "........................................" ) try : rs = subprocess.check_output([ "dir" , "c:" ], stderr =subprocess.STDOUT) print ( "Exit code: " , rs) # 执行后的返回结果 except Exception as e: print (e) print ( "........................................" ) ‘‘‘以下命令在linux上尝试‘‘‘ import subprocess rs = subprocess.call( "ls -l hellokity" , shell = True ) print ( "Exit code: " , rs) # 执行后的返回结果 try : rs = subprocess.check_call( "ls -l hellokity" , shell = True ) except subprocess.CalledProcessError as e: print (e.returncode) try : rs = subprocess.check_output( "ls -l hellokity" , shell = True , stderr =subprocess.STDOUT) except subprocess.CalledProcessError as e: out_bytes = e.output.decode() # Output generated before error,这里需指定stderr=subprocess.STDOUT,报错后才有内容返回 code = e.returncode # Return code print (out_bytes, code) ‘‘‘Popen的交互 Popen对象创建后,主程序不会自动等待子进程完成。我们必须调用对象的wait()方法,父进程才会等待 communicate()是Popen对象的一个方法,该方法会阻塞父进程,直到子进程完成。 ‘‘‘ child1 = subprocess.Popen([ "ls" , "-l" ], stdout =subprocess.PIPE) child2 = subprocess.Popen([ "wc" , "-l" ], stdin =child1.stdout, stdout =subprocess.PIPE) stdout, stderr = child2.communicate() # 负责交互 print (stdout.decode(), stderr) text = b‘‘‘ abc 123 xya sda ‘‘‘ child = subprocess.Popen([ "wc" , "-l" ], stdin =subprocess.PIPE, stdout =subprocess.PIPE) # child.wait() #如果是调用了communicate,则不需使用wait,因为communicate自动等待子进程结束 stdout, stderr = child.communicate(text) # 负责交互 print (stdout.decode(), stderr)
本文出自 “90SirDB” 博客,请务必保留此出处http://90sirdb.blog.51cto.com/8713279/1922622
原文地址:http://90sirdb.blog.51cto.com/8713279/1922622