subprocess模塊:專門用於py執行系統命令
1. 簡單命令的執行
# !usr/bin/env python
# -*- coding:utf-8 -*-
import subprocess
# subprocess模塊中,多個指令的輸入,由參數shell決定輸入形式是字符串還是序列,如下:
# ret = subprocess.call(["ls", "-l"], shell=False)
# ret = subprocess.call("ls -l", shell=True)
# 需注意,以上命令需要在linux系統下運行
# call執行命令,返回狀態碼
re1 = subprocess.call('ipconfig')
print(re1)
# check_all執行命令,如果執行狀態碼是 0 ,則返回0,否則拋異常
re2 = subprocess.check_call('ipconfig')
print(re2)
# check_output執行命令,如果狀態碼是 0 ,則返回執行結果,否則拋異常
re3 = subprocess.check_output('ipconfig')
print(re3)
2. 複雜命令的執行
現在有很多人都想學python,但是直接看教程又有點太難下手。
之前有幾個朋友都問我能不能指導他們一下入門學這個語言,於是我就弄了個零基礎免費學習python的群,每天講一點內容(145010486),提供免費的學習資料還有答疑。如果有0基礎想入門的新手,不如來跟著看看,歡迎加入我們共同學習的隊伍。
a.參數:
args: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 -> 同意使用
startupinfo與createionflags只在windows下有效
將被傳遞給底層的CreateProcess()函數,用於設置子進程的一些屬性,如:主窗口的外觀,進程的優先級等等
b.執行普通命令:
import subprocess
ret1 = subprocess.Popen(["mkdir","t1"]) # 此命令在linux中才能運行
ret2 = subprocess.Popen("mkdir t2", shell=True)
c.執行複雜命令的四種用法:
對了,作者建了個小群,有興趣的親們可以入群一起聊天,學習,交流:145 010 486
###終端輸入命令分為兩種:輸入即可得到輸出,eg:ipconfig;輸入進行某環境,依賴再輸入,如:python###
第一種
import subprocess
obj = subprocess.Popen("mkdir t3", shell=True, cwd='/home/dev',)
# cwd:在創建目錄前,先跳轉到指定目錄,再創建目錄
第二種
:最基本的
import subprocess
# 執行python,並指定三個管道。universal_newlines:新行換行符
obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE,
stderr=subprocess.PIPE, universal_newlines=True)
print(cmd_out)
print(cmd_error)
第三種
:常用的
import subprocess
obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE,
stderr=subprocess.PIPE, universal_newlines=True)
out_error_list = obj.communicate() # communicate()讀取輸出和錯誤全部結果
print(out_error_list)
第四種:對於單條命令可簡化
import subprocess
obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE,
stderr=subprocess.PIPE, universal_newlines=True)
out_error_list = obj.communicate('print("hello")')
print(out_error_list)