一、subprocess標準庫
python執(zhí)行shell腳本,通常會使用so模塊中的幾個方法,如system、spawn*、popen等。subprocess標準庫的引入就是為了取代這些老的模塊方法。subprocess使用時,父進程創(chuàng)建子進程去執(zhí)行一個外部程序,并提供了標準輸入輸出和管道(pipe)的實現(xiàn)方法。
subprocess.Popen()
subprocess庫的一個基礎類,下文介紹的subprocess.run、subprocess.call、subprocess.check_call、subprocess.check_output都是在此基礎上的封裝,若要實現(xiàn)一些復雜的業(yè)務流程使用subprocess.Popen()更靈活。
程序運行subprocess.Popen()類,父進程創(chuàng)建子進程后,不會等待子進程執(zhí)行完成。如果需要等待子進程,需要加入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 執(zhí)行完就print,示例2父進程先阻塞,等待child執(zhí)行完再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:緩沖區(qū)
stdin、stdout、stderr:標準輸入輸出和標準錯誤日志
subprocess.PIPE:創(chuàng)建Popen對象時,subprocess.PIPE可以初始化stdin、stdout、stderr參數(shù)。
標準輸出:
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() #檢查子進程狀態(tài)
child.kill() #終止子進程
child.send_signal() #向子進程發(fā)送信號
child.terminate() #終止子進程
subprocess.run()
subprocess.run()函數(shù)是Python3.5中新增的一個高級函數(shù),其返回值是一個subprocess.CompletedPorcess類的實例。
child = subprocess.run('python --version', shell =True)
print(child)
#CompletedProcess(args='python --version', returncode=0)
subprocess.call()
父進程等待子進程完成
執(zhí)行成功返回0
執(zhí)行失敗returncode=2,不會主動拋error
child = subprocess.call('python --version', shell =True)
print(child)
subprocess.check_call()
父進程等待子進程完成
執(zhí)行成功返回0
returncode不為0,拋出subprocess.CalledProcessError:error信息只有returncode
child = subprocess.check_call('python --version', shell =True)
print(child)
subprocess.check_output()
父進程等待子進程完成
執(zhí)行成功返回output信息
returncode不為0,拋出subprocess.CalledProcessError:error信息包含returncode和output信息
child = subprocess.check_output('python --version', shell =True)
print(child)