一、subprocess標准庫
python執行shell腳本,通常會使用so模塊中的幾個方法,如system、spawn*、popen等。subprocess標准庫的引入就是為了取代這些老的模塊方法。subprocess使用時,父進程創建子進程去執行一個外部程序,並提供了標准輸入輸出和管道(pipe)的實現方法。
subprocess.Popen()
subprocess庫的一個基礎類,下文介紹的subprocess.run、subprocess.call、subprocess.check_call、subprocess.check_output都是在此基礎上的封裝,若要實現一些復雜的業務流程使用subprocess.Popen()更靈活。
程序運行subprocess.Popen()類,父進程創建子進程后,不會等待子進程執行完成。如果需要等待子進程,需要加入wait()方法阻塞父進程。
示例1
child = subprocess.Popen('ping www.baidu.com') print('End')
示例2
child = subprocess.Popen('ping www.baidu.com') child.wait() print('End')
以上示例1沒有等child 執行完就print,示例2父進程先阻塞,等待child執行完再print。
subprocess.Popen(args, bufsize=-1, executable=None,stdin=None, stdout=None, stderr=None,preexec_fn=None, close_fds=_PLATFORM_DEFAULT_CLOSE_FDS,shell=False, cwd=None, env=None, universal_newlines=False,startupinfo=None, creationflags=0,restore_signals=True, start_new_session=False,pass_fds=(), *, encoding=None, errors=None)
args:shell命令,可以是str類型,或者list和tuple
bufsize:緩沖區
stdin、stdout、stderr:標准輸入輸出和標准錯誤日志
subprocess.PIPE:創建Popen對象時,subprocess.PIPE可以初始化stdin、stdout、stderr參數。
標准輸出:
import subprocess child = subprocess.Popen(['shell','python --version'], stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr= subprocess.PIPE) shell_out = child.stdout.read() # shell_out = child.communicate() 也可以使用communicate()方法輸出 shell_error = child.stderr.read() print(shell_out) print(shell_error)
其他方法:
child.poll() #檢查子進程狀態 child.kill() #終止子進程 child.send_signal() #向子進程發送信號 child.terminate() #終止子進程
subprocess.run()
subprocess.run()函數是Python3.5中新增的一個高級函數,其返回值是一個subprocess.CompletedPorcess類的實例。
child = subprocess.run('python --version', shell =True) print(child) #CompletedProcess(args='python --version', returncode=0)
subprocess.call()
父進程等待子進程完成
執行成功返回0
執行失敗returncode=2,不會主動拋error
child = subprocess.call('python --version', shell =True) print(child) #0
subprocess.check_call()
父進程等待子進程完成
執行成功返回0
returncode不為0,拋出subprocess.CalledProcessError:error信息只有returncode
child = subprocess.check_call('python --version', shell =True) print(child) #0
subprocess.check_output()
父進程等待子進程完成
執行成功返回output信息
returncode不為0,拋出subprocess.CalledProcessError:error信息包含returncode和output信息
child = subprocess.check_output('python --version', shell =True) print(child) #b'Python 3.6.4\r\n'
