python subprocess模塊詳解-曬酷學院

一、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)
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容