1. 程式人生 > >python呼叫第三方工具(命令)的方法及區別

python呼叫第三方工具(命令)的方法及區別

前言

在上篇《關於os.popen你可能不知道的》中,提到了呼叫第三方工具或命令的os.popen方法,同時也指出了使用中可能遇到的坑。本文就介紹下python提供了哪些方法可以執行第三方工具或命令,以及它們的用法和區別。

 

主要方法

1.  os.system

這個應該是用法最簡單的方法了,os.system(“cmd”),直接傳入要執行的命令字串即可。注意返回值,它的返回值不是執行命令的返回結果,如果命令執行成功,則返回0;否則,返回其他值。另外,該方法是阻塞的,也就是說,只有呼叫的命令執行完畢返回後,才會繼續執行後面的程式碼行。

 

2. 

os.popen

請參考《關於os.popen你可能不知道的》,不再贅述。

 

3.  Subprocess.Popen

subprocess模組是推薦的用來替換一些老的模組和函式,如:os.systemos.popen等,定義了一個類Popen,使用Popen來建立程序,並與程序互動。

 

函式原型:

class subprocess.Popen(args, bufsize=-1, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=True, 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

字串或列表

bufsize

0-無緩衝;1-行緩衝;其他正值-緩衝區大小;負值-預設系統緩衝(一般全緩衝)

executable

一般不用,args字串或列表第一項表示程式名

stdin

stdout

stderr

None-沒有重定向,繼承父程序

PIPE-建立管道

檔案物件

檔案描述符

stderr還可設定為STDOUT

preexec_fn

鉤子函式,在

forkexec之間執行(unix

close_fds

Unix下執行新程序前是否關閉0/1/2之外的檔案;

Windows下是否繼承父程序的檔案描述符

shell

如果設定為True,則unix下相當於args前面加”/bin/sh”  “-c”;

Windows下相當於新增”cmd.exe  /c”

cmd

設定工作目錄

env

設定環境變數

universal_newlines

各種換行符統一處理成”\n”

startupinfo

Windows下傳遞給CreateProcess的結構體

creationflags

Windows下傳遞CREATE_NEW_CONSOLE建立自己的控制檯視窗

 

Popen提供的引數數量就能感知其功能強大,但使用Popen函式注意:如果執行cmd命令時產生內容非常多,而標準輸出使用subprocess提供的PIPE,輸出內容可能塞滿緩衝區,造成阻塞。一般的解決方法是自定義檔案流代替標準輸出的subprocess.PIPE

 

4.  subprocess.call

 

函式原型:

subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False, timeout=None)

 

函式解釋:

Run the command described by args. Wait for command to complete, then return the returncode attribute

 

該函式執行args接收的命令,等待命令執行完成,然後返回returncode

 

從函式解釋可知,該函式是阻塞型的,會一直等待子程序執行結束,並返回程序的returncode後,才會繼續執行程式後面的程式碼行。如果不需要與子程序進行互動,且需要阻塞,可以使用該函式來完成任務。

 

總結

在呼叫第三方工具的方法上,python本身提供了相當多的實現方法,我們在使用時,需要根據實際問題、各種方法的特性進行選擇。

 

其他資源

關於python學習、分享、交流,筆者開通了微信公眾號小蟒社群】,感興趣的朋友可以關注下,歡迎加入,建立屬於我們自己的小圈子,一起學python