用python執行繫命令的相關的模塊和函數的功能均在 subprocess 模塊中實現,並提供了豐富的功能python
call()模塊函數shell
功能:輸入系統命令,直接執行命令,返回狀態碼,只能查看【有參】windows
使用方法1:模塊名稱.call(["系統命令","系統命令"],shell=False)
函數
使用方法2:模塊名稱.call("系統命令",shell=True)spa
格式如1:subprocess.call(["ls", "-l"],shell=False)code
格式如2:subprocess.call("ls -lh",shell=True)對象
#!/usr/bin/env python # -*- coding:utf8 -*- import subprocess #導入模塊 subprocess.call(["ls", "-l"],shell=False)#輸入系統命令,直接查看對應命令的功能【有參】 subprocess.call("ls -lh",shell=True)#輸入系統命令,直接查看對應命令的功能【有參】
check_call()模塊函數blog
功能:輸入系統命令,直接執行命令,返回狀態碼,若是狀態碼是 0 ,則返回執行結果,不然拋異常【有參】繼承
使用方法1:模塊名稱.check_call(["系統命令","系統命令"],shell=False)
進程
使用方法2:模塊名稱.check_call("系統命令",shell=True)
格式如1:subprocess.check_call(["ls", "-l"],shell=False)
格式如2:subprocess.check_call("ls -lh",shell=True)
#!/usr/bin/env python # -*- coding:utf8 -*- import subprocess #導入模塊 subprocess.check_call(["ls", "-l"],shell=False)#輸入系統命令,直接執行命令,返回狀態碼,若是狀態碼是 0 ,則返回執行結果,不然拋異常 subprocess.check_call("ls -lh",shell=True)#輸入系統命令,直接執行命令,返回狀態碼,若是狀態碼是 0 ,則返回執行結果,不然拋異常
check_output()模塊函數
功能:執行命令,若是狀態碼是 0 ,則返回執行結果,不然拋異常【有參】
使用方法1:模塊名稱.check_output(["系統命令","系統命令"],shell=False)
使用方法2:模塊名稱.check_output("系統命令",shell=True)
格式如1:subprocess.check_output(["ls", "-l"],shell=False)
格式如2:subprocess.check_output("ls -lh",shell=True)
#!/usr/bin/env python # -*- coding:utf8 -*- import subprocess #導入模塊 a = subprocess.check_call(["ls", "-l"],shell=False)#執行命令,若是狀態碼是 0 ,則返回執行結果,不然拋異常【有參】 print(a) b = subprocess.check_output("dir",shell=True)#執行命令,若是狀態碼是 0 ,則返回執行結果,不然拋異常【有參】 print(b) # 輸出 # b' \xc7\xfd\xb6\xaf\xc6\xf7 H \xd6\xd0\xb5\xc4\xbe\xed\xc3\xbb\xd3\xd0\xb1\xea\xc7\xa9\xa1\xa3\r\n
Popen()模塊函數
功能:用於執行復雜的系統命令【有參】
參數:
shell=命令,能夠是字符串或者序列類型(如:list,元組)
bufsize:指定緩衝。0 無緩衝,1 行緩衝,其餘 緩衝區大小,負值 系統緩衝
stdin, stdout, stderr:分別表示程序的標準輸入、輸出、錯誤句柄
preexec_fn:只在Unix平臺下有效,用於指定一個可執行對象(callable object),它將在子進程運行以前被調用
close_sfs:在windows平臺下,若是close_fds被設置爲True,則新建立的子進程將不會繼承父進程的輸入、輸出、錯誤管道。
因此不能將close_fds設置爲True同時重定向子進程的標準輸入、輸出與錯誤(stdin, stdout, stderr)。
shell:同上
cwd=用於設置子進程的當前目錄
env:用於指定子進程的環境變量。若是env = None,子進程的環境變量將從父進程中繼承。
universal_newlines:不一樣系統的換行符不一樣,True -> 贊成使用 \n
startupinfo與createionflags只在windows下有效
將被傳遞給底層的CreateProcess()函數,用於設置子進程的一些屬性,如:主窗口的外觀,進程的優先級等等
終端輸入的命令分爲兩種:
1.輸入便可獲得輸出,如:dir 命令
方法1:模塊名稱.Popen(["系統命令", "系統命令"],shell=命令模式)
方法2:模塊名稱.Popen("系統命令",shell=命令模式)
#!/usr/bin/env python # -*- coding:utf8 -*- import subprocess #導入模塊 a = subprocess.Popen(["ls", "-l"],shell=False)#執行命令,
b = subprocess.Popen("ls -l",shell=True)#執行命令,
cwd=用於設置子進程的當前目錄
方法:模塊名稱.Popen("系統命令",shell=命令模式,cwd="系統目標目錄") 好比要先進入目錄後再執行命令的狀況
#!/usr/bin/env python # -*- coding:utf8 -*- import subprocess #導入模塊 obj = subprocess.Popen("mkdir t3", shell=True, cwd='/home/dev',)#執行命令,爲先執行的目錄
2.輸入進行某環境,依賴再輸入,如:python
Popen()參數
stdin輸入通道
stdout輸出通道
stderr錯誤輸出通道
universal_newlines啓用換行符
方法:模塊名稱.Popen("系統命令", shell=命令模式, 輸入通道, 輸出通道, 錯誤通道, 啓用換行符)
格式:subprocess.Popen("python", shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
write()模塊函數
功能:向輸入通道寫入命令【有參】
使用方法:對象變量.輸入通道名稱.write("系統命令")
格式如:obj.stdin.write("print(1)\n")
close()模塊函數
功能:關閉通道,關閉輸入通道,關閉輸出通道,關閉錯誤通道【無參】
使用方法:對象變量.要關閉通道名稱.close()
格式如:obj.stdin.close()
read()模塊函數
功能:1.輸出通道獲取結果,2.錯誤通道獲取出錯信息【無參】
使用方法:對象變量.輸出通道或錯誤通道名稱.read()
格式如1:obj.stdout.read()
格式如2:obj.stderr.read()
#!/usr/bin/env python # -*- coding:utf8 -*- import subprocess #導入模塊 obj = subprocess.Popen("python", shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)#建立命令對象 obj.stdin.write("print(1)\n")#輸入通道寫入命令 obj.stdin.write("print(2)")#輸入通道寫入命令 obj.stdin.close()#關閉輸入通道 cmd_out = obj.stdout.read()#輸出通道獲取結果 obj.stdout.close()#關閉輸出通道 cmd_error = obj.stderr.read()#錯誤通道獲取出錯信息 obj.stderr.close()#關閉錯誤通道 print(cmd_out)#打印出輸出通道信息 print(cmd_error)#打印錯誤通道信息 # 輸出 # 1 # 2
communicate()模塊函數
功能:自動選擇通道,能夠自動獲取通道信息,若是傳值將自動寫入輸入通道,而後自動獲取輸出通道信息【有參可選】
使用方法1:對象變量.communicate()
使用方法2:對象變量.communicate('輸入通道命令')
格式如1:obj.stdout.read()
格式如2:obj.stderr.read('print("hello")')
列1
#!/usr/bin/env python # -*- coding:utf8 -*- import subprocess obj = subprocess.Popen("python", shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)#建立對象 obj.stdin.write("print(1)\n")#輸入通道寫入命令 obj.stdin.write("print(2)")#輸入通道寫入命令 obj.stdin.close()#關閉輸入通道 out_error_list = obj.communicate()#自動選擇通道,能夠自動獲取通道信息,若是傳值將自動寫入輸入通道,而後自動獲取輸出通道信息 print(out_error_list) # 輸出 # ('1\n2\n', '')
列2
#!/usr/bin/env python # -*- coding:utf8 -*- import subprocess obj = subprocess.Popen("python", shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)#建立對象 out_error_list = obj.communicate('print("hello")')#自動選擇通道,能夠自動獲取通道信息,若是傳值將自動寫入輸入通道,而後自動獲取輸出通道信息 print(out_error_list) # 輸出 # ('hello\n', '')