網站首頁 編程語言 正文
1. 方法一:使用os模塊的system方法
os.system(cmd)
,其返回值是shell指令運行后返回的狀態碼,int類型,0表示shell指令成功執行,256/512表示未找到,該方法適用于shell命令不需要輸出內容的場景。
os.system(cmd)
會啟動子進程,在子進程中執行cmd,如果cmd有執行內容,會在標準輸出顯示。
舉例說明:
列舉當前目錄下的所有文件。
import os
val = os.system('ls -al')
print val #輸出為0
val = os.system('ls -al non_exist_folder')
print val #輸出為512
val = os.system('ls -al|grep non_exist_val')
print val #輸出為256
2. 方法二:使用os.popen()
該方法以文件的形式返回shell指令運行后的結果,需要獲取內容時可使用read()
或readlines()
方法。
os.system(cmd)
或os.popen(cmd)
,前者返回值是腳本的退出狀態碼,后者的返回值是腳本執行過程中的輸出內容。實際使用時視需求情況而選擇。
舉例:
import os
os.popen('ls -l')
# 輸出:<open file 'ls -l', mode 'r' at 0x7f46af044930>
os.popen('ls -l').read() #返回字符串類型的結果
#輸出:'total 0\n-rw-rw-r-- 1 roaddb roaddb 0 Dec 11 10:09 a.txt\n-rw-rw-r-- 1 roaddb roaddb 0 Dec 11 10:09 b.txt\n'
os.popen('ls -l').readlines() #返回一個list類型的結果
# 輸出:['total 0\n', '-rw-rw-r-- 1 roaddb roaddb 0 Dec 11 10:09 a.txt\n', '-rw-rw-r-- 1 roaddb roaddb 0 Dec 11 10:09 b.txt\n']
val=os.popen('ls -al')
for i in val.readlines():
print i
3. 方法三:使用commands模塊,有三個方法可以使用
(1)commands.getstatusoutput(cmd)
其以元組(status,output)的形式返回命令執行后的返回狀態和執行結果。其中,對cmd的執行實際上是按照{cmd;} 2>&1的方式,所以output中包含控制臺輸出信息或者錯誤信息,output中不包含尾部的換行符。
(2)commands.getoutput(cmd)
返回cmd的輸出結果。
(3)commands.getstatus(file)
返回ls -l file的執行結果字符串,調用了getoutput,不建議使用此方法
import commands
aa=commands.getstatusoutput('ls -l')
# 輸出:(0, 'total 0\n-rw-rw-r-- 1 roaddb roaddb 0 Dec 11 10:09 a.txt\n-rw-rw-r-- 1 roaddb roaddb 0 Dec 11 10:09 b.txt')
# 返回一個元組,對比os.popen(cmd)的返回結果,發現output中不包含尾部的換行符
bb=commands.getoutput('ls -l') #只返回執行結果
# 輸出:'total 0\n-rw-rw-r-- 1 roaddb roaddb 0 Dec 11 10:09 a.txt\n-rw-rw-r-- 1 roaddb roaddb 0 Dec 11 10:09 b.txt'
cc=commands.getstatus('a.txt') #查詢某個文件的狀態
# 輸出:'-rw-rw-r-- 1 roaddb roaddb 0 Dec 11 10:09 a.txt'
dd=commands.getstatusoutput('ls -l non_exist_folder') #執行結果中包含控制臺輸出信息或者錯誤信息
# 輸出:(512, "ls: cannot access 'non_exist_folder': No such file or directory")
4. 方法三:subprocess模塊,
允許創建很多子進程,創建的時候能指定子進程和子進程的輸入、輸出、錯誤輸出管道,執行后能獲取輸出結果和執行狀態。
(1)subprocess.run():
python3.5中新增的函數, 執行指定的命令, 等待命令執行完成后返回一個包含執行結果的CompletedProcess類的實例。
(2)subprocess.call():
執行指定的命令, 返回命令執行狀態, 功能類似os.system(cmd)。
(3)subprocess.check_call():
python2.5中新增的函數, 執行指定的命令, 如果執行成功則返回狀態碼, 否則拋出異常。
說明:
subprocess.run(args, *, stdin=None, input=None, stdout=None,stderr=None, shell=False, timeout=None, check=False,universal_newlines=False)
subprocess.call(args, *, stdin=None, stdout=None, stderr=None,shell=False, timeout=None)
subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None,shell=False, timeout=None)
args:表示shell指令,若以字符串形式給出shell指令,如"ls -l “則需要使shell = Ture。否則默認以數組形式表示shell變量,如"ls”,“-l”。
當使用比較復雜的shell語句時,可以先使用shlex模塊的shlex.split()方法來幫助格式化命令,然后在傳遞給run()方法或Popen。
subprocess.run()、subprocess.call()、subprocess.check_call()、subprocess.check_output()
都是通過對subprocess.Popen的封裝來實現的高級函數,因此如果我們需要更復雜功能時,可以通過subprocess.Popen來完成
使用舉栗:
import shlex
import subprocess
command='ls -l'
args=shlex.split('ls -l')
bb=subprocess.Popen(args) #bb是一個Popen的對象,該對象不能通過read()或readlines()來讀取
輸出:total 0
-rw-rw-r-- 1 roaddb roaddb 0 Dec 11 10:09 a.txt
-rw-rw-r-- 1 roaddb roaddb 0 Dec 11 10:09 b.txt #在該處需要點擊換行符才會結束
aa=subprocess.call('ls -l',shell=True) #其返回值為shell命令的執行返回碼
輸出:total 0
-rw-rw-r-- 1 roaddb roaddb 0 Dec 11 10:09 a.txt
-rw-rw-r-- 1 roaddb roaddb 0 Dec 11 10:09 b.txt #直接返回
5. 示例
在Python3中的情況
期望:想要在Python3中執行curl命令并返回執行結果,返回結果時json體
分析:
cmd='curl -s "http://127.0.0.1:8080/xxxxx"'
1)使用os.system(cmd)
無法獲取輸出內容
2)使用os.popen(cmd).read()
可以獲取到返回的json體${aa}
,通過json.loads(${aa})
可以將json體轉為字典樣式
3)commands模塊在Python3.0中被廢棄了
4)subprocess.getstatusoutput(cmd)
輸出結果類似于python2中的commands.getstatusoutput(cmd)
,返回一個元組,元組的第2個值是執行結果${aa}
,通過json.loads(${aa})
可以將json體轉為字典樣式。
原文鏈接:https://blog.csdn.net/weixin_39589455/article/details/127937564
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2022-03-03 編輯時使用Object.assign({},row) el-form表單無法編輯 el-select
- 2022-10-26 Jenkins+Docker?一鍵自動化部署?SpringBoot?項目的詳細步驟_docker
- 2022-02-18 解決上傳apk文件后為vnd.android.package-archive格式的問題
- 2022-07-24 Python實現FIFO緩存置換算法_python
- 2022-05-12 Android 截屏實現、屏幕截圖、MediaProjection、ImageReader
- 2023-07-09 關于 axios 是什么?以及怎么用?
- 2022-11-22 Rust?Struct結構體詳解_Rust語言
- 2021-12-01 阻止谷歌瀏覽器彈出記住密碼的彈框
- 欄目分類
-
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支