python subprocess模塊詳解


一、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'

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM