作為膠水語(yǔ)言,Python可以很方便的執(zhí)行系統(tǒng)命令,Python3中常用的執(zhí)行操作系統(tǒng)命令有os.system()、os.popen()、subprocess.popen()、subprocess.call()、subprocess.run()、subprocess.getstatusoutput()六種方法。
os.system()
system函數(shù)可以將字符串轉(zhuǎn)化成命令在服務(wù)器上運(yùn)行;其原理是每一條system函數(shù)執(zhí)行時(shí),其會(huì)創(chuàng)建一個(gè)子進(jìn)程在系統(tǒng)上執(zhí)行命令行,子進(jìn)程的執(zhí)行結(jié)果無(wú)法影響主進(jìn)程。
其返回值是指令運(yùn)行后返回的狀態(tài)碼,0表示指令成功執(zhí)行,1表示失敗,256表示沒(méi)有返回結(jié)果,該方法適用于系統(tǒng)命令不需要輸出內(nèi)容的場(chǎng)景。
用法:
示例:
import os
a=os.system("ping 192.168.1.101") #使用a接收返回值
print(a)
輸出:
正在 Ping 192.168.1.101 具有 32 字節(jié)的數(shù)據(jù):
來(lái)自 192.168.1.101 的回復(fù): 字節(jié)=32 時(shí)間=8ms TTL=127
來(lái)自 192.168.1.101 的回復(fù): 字節(jié)=32 時(shí)間=2ms TTL=127
來(lái)自 192.168.1.101 的回復(fù): 字節(jié)=32 時(shí)間=2ms TTL=127
來(lái)自 192.168.1.101 的回復(fù): 字節(jié)=32 時(shí)間=2ms TTL=127
192.168.1.101 的 Ping 統(tǒng)計(jì)信息:
數(shù)據(jù)包: 已發(fā)送 = 4,已接收 = 4,丟失 = 0 (0% 丟失),
往返行程的估計(jì)時(shí)間(以毫秒為單位):
最短 = 2ms,最長(zhǎng) = 8ms,平均 = 3ms
0
Process finished with exit code 0
也可以在linux系統(tǒng)下運(yùn)行
import os
os.system('cd /home mkdir test') 執(zhí)行多條命令可以使用連接
os.popen(command,mode)
這種調(diào)用方式是通過(guò)管道的方式來(lái)實(shí)現(xiàn),這個(gè)函數(shù)的返回值是一個(gè)文件對(duì)象,可以讀或者寫(xiě)(由mode決定,mode默認(rèn)是'r')。如果mode為'r',調(diào)用該對(duì)象的read()或readlines()方法可以讀取輸出內(nèi)容。
用法:os.popen(command[, mode[, bufsize]])
os.system(cmd)或os.popen(cmd),前者返回值是腳本的退出狀態(tài)碼,后者的返回值是腳本執(zhí)行過(guò)程中的輸出內(nèi)容。
import os
a=os.popen("ipconfig")
print(a.read())
輸出:
以太網(wǎng)適配器 以太網(wǎng):
連接特定的 DNS 后綴 . . . . . . . :
本地鏈接 IPv6 地址. . . . . . . . : fe81::b0ed:2b1b:7385:97d1%8
IPv4 地址 . . . . . . . . . . . . : 192.168.1.100
子網(wǎng)掩碼 . . . . . . . . . . . . : 255.255.255.0
默認(rèn)網(wǎng)關(guān). . . . . . . . . . . . . : 192.168.1.1
subprocess模塊
subprocess模塊是python從2.4版本開(kāi)始引入的模塊,主要用來(lái)取代 一些舊的模塊方法,如os.system、os.spawn、os.popen、commands.*等。官方推薦使用該模塊執(zhí)行系統(tǒng)命令,subprocess模塊通過(guò)子進(jìn)程來(lái)執(zhí)行外部指令,并通過(guò)input/output/error管道,獲取子進(jìn)程的執(zhí)行的返回信息。
好處在于:運(yùn)用對(duì)線程的控制和監(jiān)控,將返回的結(jié)果賦于一變量,便于程序的處理。
subprocess.Popen()
使用Popen可以創(chuàng)建進(jìn)程,并與進(jìn)程進(jìn)行復(fù)雜的交互。
用法:child = subprocess.Popen(["cmd","arg1"...])
常用參數(shù)說(shuō)明:
![](http://img.jbzj.com/file_images/article/202101/202112890935770.png?20210289108)
示例
from subprocess import PIPE, Popen
# 返回的是 Popen 實(shí)例對(duì)象
proc = Popen(
'ipconfig', # cmd特定的查詢空間的命令
stdin=None, # 標(biāo)準(zhǔn)輸入 鍵盤(pán)
stdout=PIPE, # -1 標(biāo)準(zhǔn)輸出(演示器、終端) 保存到管道中以便進(jìn)行操作
stderr=PIPE, # 標(biāo)準(zhǔn)錯(cuò)誤,保存到管道
shell=True)
# print(proc.communicate()) # 標(biāo)準(zhǔn)輸出的字符串+標(biāo)準(zhǔn)錯(cuò)誤的字符串
outinfo, errinfo = proc.communicate()
print(outinfo.decode('gbk')) # 外部程序(windows系統(tǒng))決定編碼格式
print(errinfo.decode('gbk'))
輸出:
以太網(wǎng)適配器 以太網(wǎng):
連接特定的 DNS 后綴 . . . . . . . :
本地鏈接 IPv6 地址. . . . . . . . : fe81::b0ed:2b1b:7385:97d1%8
IPv4 地址 . . . . . . . . . . . . : 192.168.1.100
子網(wǎng)掩碼 . . . . . . . . . . . . : 255.255.255.0
默認(rèn)網(wǎng)關(guān). . . . . . . . . . . . . : 192.168.1.1
Process finished with exit code 0
subprocess.call()
執(zhí)行指定的命令, 返回命令執(zhí)行狀態(tài), 功能類(lèi)似os.system(cmd),參數(shù)shell默認(rèn)為False
用法:subprocess.call("command")
# linux獲取磁盤(pán)空間
import subprocess
subprocess.call(['df', '-h']) # 數(shù)組作為參數(shù)運(yùn)行命令
輸出:
Filesystem Size Used Avail Use% Mounted on
devtmpfs 909M 0 909M 0% /dev
tmpfs 920M 32K 920M 1% /dev/shm
tmpfs 920M 472K 919M 1% /run
tmpfs 920M 0 920M 0% /sys/fs/cgroup
/dev/vda1 50G 6.2G 41G 14% /
tmpfs 184M 0 184M 0% /run/user/0
subprocess.run()
python3.5中新增的函數(shù), 執(zhí)行指定的命令, 等待命令執(zhí)行完成后返回一個(gè)包含執(zhí)行結(jié)果的CompletedProcess類(lèi)的實(shí)例。run默認(rèn)不會(huì)返回輸出,只返回命令和執(zhí)行狀態(tài)。
用法:
subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, shell=False, timeout=None, check=False, universal_newlines=False)
import subprocess
completed = subprocess.run(['ls', '-1'])
print('returncode:', completed.returncode)
subprocess.getstatusoutput()
執(zhí)行cmd命令,返回一個(gè)元組(命令執(zhí)行狀態(tài),命令執(zhí)行結(jié)果輸出)。
返回狀態(tài)碼和結(jié)果,0表示成功
import subprocess
ret, val = subprocess.getstatusoutput("ping www.baidu.com")
print(ret)
print(val)
輸出:
0
正在 Ping www.a.shifen.com [14.215.177.39] 具有 32 字節(jié)的數(shù)據(jù):
來(lái)自 14.215.177.39 的回復(fù): 字節(jié)=32 時(shí)間=29ms TTL=53
來(lái)自 14.215.177.39 的回復(fù): 字節(jié)=32 時(shí)間=29ms TTL=53
來(lái)自 14.215.177.39 的回復(fù): 字節(jié)=32 時(shí)間=29ms TTL=53
來(lái)自 14.215.177.39 的回復(fù): 字節(jié)=32 時(shí)間=30ms TTL=53
14.215.177.39 的 Ping 統(tǒng)計(jì)信息:
數(shù)據(jù)包: 已發(fā)送 = 4,已接收 = 4,丟失 = 0 (0% 丟失),
往返行程的估計(jì)時(shí)間(以毫秒為單位):
最短 = 29ms,最長(zhǎng) = 30ms,平均 = 29ms
關(guān)于subprocess模塊的具體用法,大家可以查看文檔進(jìn)行學(xué)習(xí)https://docs.python.org/3/library/subprocess.html。
到此這篇關(guān)于詳解Python調(diào)用系統(tǒng)命令的六種方法的文章就介紹到這了,更多相關(guān)Python調(diào)用系統(tǒng)命令內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- Python實(shí)現(xiàn)類(lèi)似jQuery使用中的鏈?zhǔn)秸{(diào)用的示例
- 解決python調(diào)用matlab時(shí)的一些常見(jiàn)問(wèn)題
- Python調(diào)用R語(yǔ)言實(shí)例講解
- python程序調(diào)用遠(yuǎn)程服務(wù)的步驟詳解
- 使用pycallgraph分析python代碼函數(shù)調(diào)用流程以及框架解析
- Python與C/C++的相互調(diào)用案例
- python調(diào)用百度AI接口實(shí)現(xiàn)人流量統(tǒng)計(jì)
- 安裝python依賴包psycopg2來(lái)調(diào)用postgresql的操作
- Python調(diào)用系統(tǒng)命令os.system()和os.popen()的實(shí)現(xiàn)
- 詳解如何在VS2019和VScode中配置C++調(diào)用python接口
- python中如何實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用