第四十四節,subprocess系統命令模塊

用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', '')
相關文章
相關標籤/搜索