Python常用外部指令執(zhí)行代碼實(shí)例
1、os.system()
阻塞
屏幕會(huì)打印命令的輸出
返回命令結(jié)果碼
# -*- encoding=utf-8 -*-
import os
if __name__ == '__main__':
pass
print('開(kāi)始')
ret1 = os.system('python')
print('ret1:{}'.format(ret1))
ret2 = os.system('java -version')
print('ret2:{}'.format(ret2))
print('結(jié)束')
運(yùn)行

可能有人理解阻塞是因?yàn)檫\(yùn)行了python,因此我嘗試兩個(gè)命令都用java -version
# -*- encoding=utf-8 -*-
import os
if __name__ == '__main__':
pass
print('開(kāi)始')
ret1 = os.system('java -version')
print('ret1:{}'.format(ret1))
ret2 = os.system('java -version')
print('ret2:{}'.format(ret2))
print('結(jié)束')
運(yùn)行

2、os.popen()
阻塞或不阻塞
屏幕不會(huì)打印出命令的輸出
返回文件對(duì)象,可用read,readline讀取
不阻塞時(shí):
# -*- encoding=utf-8 -*-
import os
if __name__ == '__main__':
pass
print('開(kāi)始')
os.popen('python')
ret2 = os.popen('java -version')
print('結(jié)束')
運(yùn)行(程序很快打印開(kāi)始和結(jié)束,就像只用了兩個(gè)print語(yǔ)句一樣快)

阻塞時(shí):
# -*- encoding=utf-8 -*-
import os
if __name__ == '__main__':
pass
print('開(kāi)始')
ret1 = os.popen('python')
print(ret1.read())
ret2 = os.popen('java -version')
print(ret2.read())
print('結(jié)束')
運(yùn)行

3、commands.getstatusoutput
python2.+中使用
需要到linux運(yùn)行
阻塞或者非阻塞
屏幕不會(huì)打印出命令的輸出
非阻塞時(shí)
# -*- encoding=utf-8 -*-
import commands
if __name__ == '__main__':
pass
print('開(kāi)始')
ret1 = commands.getstatusoutput('python')
ret2 = commands.getstatusoutput('java -version')
print('結(jié)束')
運(yùn)行

阻塞時(shí):
# -*- encoding=utf-8 -*-
import commands
if __name__ == '__main__':
pass
print('開(kāi)始')
ret1 = commands.getstatusoutput('python')
print ret1[0]
print ret1[1]
print '=============='
ret2 = commands.getstatusoutput('java -version')
print ret2[0]
print ret2[1]
print '=============='
print('結(jié)束')
運(yùn)行

4、subprocess中Popen
阻塞或非阻塞,同上面一樣,通過(guò)是否讀取IO決定是否阻塞
屏幕會(huì)打印出命令的輸出
可通過(guò)stdout,stderr參數(shù)指定輸出或錯(cuò)誤打印到文件
# -*- encoding=utf-8 -*-
import subprocess
if __name__ == '__main__':
pass
print('開(kāi)始')
s1 = subprocess.Popen('python')
s1.wait()
s2 = subprocess.Popen('java -version')
s2.wait()
print('結(jié)束')
運(yùn)行

4.1、 輸出到文件
通過(guò)文件對(duì)象來(lái)輸出到文件中
# -*- encoding=utf-8 -*-
import subprocess
if __name__ == '__main__':
pass
print('開(kāi)始')
with open('s1.txt', 'w') as f:
s1 = subprocess.Popen('python', stdout=f, ) # 指定輸出重定向到文件
s1.wait(10) # 超過(guò)10秒還沒(méi)執(zhí)行完會(huì)拋出異常
with open('s2.txt', 'w') as f:
s2 = subprocess.Popen('java -version', stdout=f, stderr=f) # 指定輸出和錯(cuò)誤都重定向到文件
s2.wait()
print('結(jié)束')
運(yùn)行后可看到文件已經(jīng)寫入,屏幕不打印。需要注意是stdout還是stderr。
4.2、捕獲輸出和錯(cuò)誤
PIPE通過(guò)開(kāi)一個(gè)新的管道來(lái)接收運(yùn)行狀態(tài)
# -*- encoding=utf-8 -*-
import subprocess
if __name__ == '__main__':
pass
print('開(kāi)始')
s1 = subprocess.Popen('java -version', stdout=subprocess.PIPE, stderr=subprocess.PIPE)
s1.wait(10) # 超過(guò)10秒還沒(méi)執(zhí)行完會(huì)拋出異常
print(s1.returncode) # 結(jié)果碼
print(s1.poll()) # 已經(jīng)執(zhí)行結(jié)束返回結(jié)果碼,否則返回None
std1 = s1.stdout.read()
print('std_out:{}'.format(std1))
std2 = s1.stderr.read()
print('std_err:{}'.format(std2))
print('結(jié)束')
運(yùn)行

5、subprocess.call
用來(lái)替代os.system
阻塞
# -*- encoding=utf-8 -*-
import subprocess
if __name__ == '__main__':
pass
print('開(kāi)始')
s1 = subprocess.call('java -version', )
print(s1)
s2 = subprocess.call('python', )
print(s2)
s3 = subprocess.call('python', timeout=3) # 超時(shí)拋出異常
print(s3)
print('結(jié)束')
6、check_call()和check_output()
都會(huì)檢查結(jié)果碼,不是0就拋出異常
check_call()返回狀態(tài)碼
check_output()返回輸出
# -*- encoding=utf-8 -*-
import subprocess
if __name__ == '__main__':
pass
print('開(kāi)始')
s1 = subprocess.check_call('java -version', )
print(s1)
s2 = subprocess.check_output('java -version', )
print(s2)
print('結(jié)束')
運(yùn)行

使用上面提到的三個(gè)方法:call()、check_call() 和 check_output() 時(shí),盡量不要將參數(shù)stderr和stdout設(shè)置為 subprocess.PIPE,這幾個(gè)函數(shù)默認(rèn)都會(huì)等待子進(jìn)程完成,子進(jìn)程產(chǎn)生大量的輸出數(shù)據(jù)如果造成管道堵塞,父進(jìn)程再等待子進(jìn)程完成可能造成死鎖。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Python 讀取用戶指令和格式化打印實(shí)現(xiàn)解析
- 如何安裝并使用conda指令管理python環(huán)境
- python執(zhí)行CMD指令,并獲取返回的方法
- Python機(jī)器學(xué)習(xí)之KNN近鄰算法
- Python機(jī)器學(xué)習(xí)算法之決策樹(shù)算法的實(shí)現(xiàn)與優(yōu)缺點(diǎn)
- 用Python給圖像算法做個(gè)簡(jiǎn)單應(yīng)用界面
- Python實(shí)現(xiàn)七大查找算法的示例代碼
- Python查找算法之插補(bǔ)查找算法的實(shí)現(xiàn)
- python實(shí)現(xiàn)狄克斯特拉算法
- python使用ProjectQ生成量子算法指令集
相關(guān)文章
python點(diǎn)云地面點(diǎn)濾波(Progressive Morphological Filter)算法介紹(PCL庫(kù))
這篇文章主要介紹了python點(diǎn)云地面點(diǎn)濾波(Progressive Morphological Filter)算法介紹(PCL庫(kù)),了解膨脹/腐蝕這兩個(gè)基礎(chǔ)操作,可以通過(guò)對(duì)其進(jìn)行簡(jiǎn)單組合來(lái)形成開(kāi)/閉操作,需要的朋友可以參考下2021-08-08
python爬蟲爬取網(wǎng)頁(yè)數(shù)據(jù)并解析數(shù)據(jù)
這篇文章主要介紹了python爬蟲如何爬取網(wǎng)頁(yè)數(shù)據(jù)并解析數(shù)據(jù),幫助大家更好的利用爬蟲分析網(wǎng)頁(yè),感興趣的朋友可以了解下2020-09-09
利用python求解物理學(xué)中的雙彈簧質(zhì)能系統(tǒng)詳解
這篇文章主要給大家介紹了關(guān)于利用python如何求解物理學(xué)中的雙彈簧質(zhì)能系統(tǒng)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09
django template 模板渲染的實(shí)現(xiàn)
Django 的模板系統(tǒng)旨在使設(shè)計(jì)人員能夠編寫 HTML,同時(shí)以一種安全和靈活的方式動(dòng)態(tài)顯示數(shù)據(jù),本文主要介紹了django template模板渲染的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2025-01-01
python 辦公自動(dòng)化——基于pyqt5和openpyxl統(tǒng)計(jì)符合要求的名單
前幾天接到的一個(gè)需求,因?yàn)閷W(xué)校給的名單是青年大學(xué)習(xí)已學(xué)習(xí)的名單,然而要知道未學(xué)習(xí)的名單只能從所有團(tuán)員中再排查一次,過(guò)程相當(dāng)麻煩。剛好我也學(xué)過(guò)一些操作辦公軟件的基礎(chǔ),再加上最近在學(xué)pyqt5,所以我決定用python寫個(gè)自動(dòng)操作文件的腳本給她用用。2021-05-05
Python發(fā)起請(qǐng)求提示UnicodeEncodeError錯(cuò)誤代碼解決方法
這篇文章主要介紹了Python發(fā)起請(qǐng)求提示UnicodeEncodeError錯(cuò)誤代碼解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
Python使用鄰接矩陣實(shí)現(xiàn)圖及Dijkstra算法問(wèn)題
這篇文章主要介紹了Python使用鄰接矩陣實(shí)現(xiàn)圖及Dijkstra算法問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12

