python執(zhí)行shell腳本的四種方法
前言:Python作為一門腳本語言,有時候需要與shell命令交互式使用,在Python中提供了很多的方法可以調用并執(zhí)行shell腳本,本文做一個簡單的總結。本文的開發(fā)環(huán)境是Ubuntu16.04.
一、os.system(“command”)
這是python自帶的執(zhí)行shell命令的方法,其中最后一個0是這個命令的返回值,為0表示命令執(zhí)行成功。但是使用system()無法將執(zhí)行的結果保存起來。
如下:
import os print(os.system("touch a.txt"))
會返回一個0,表示執(zhí)行成功了,然后在當前文件夾之下創(chuàng)建了一個新的a.txt文件
再如:
import os print(os.system("ls -a"))
它也會返回一個0,但是這個命令執(zhí)行的結果卻沒有辦法查看,即system函數(shù)不返回shell命令執(zhí)行的結果。
二、os.popen("command")方法
上面的os.system()方法沒辦法查看shell命令返回的結果,通過 os.popen() 返回的是 file read 的對象,對其進行讀取 read() 的操作可以看到執(zhí)行的輸出。
注意:os.popen() 返回的是一個文件對象f哦?。?!
如下:
import os f=os.popen("ls -l") # 返回的是一個文件對象 print(f.read()) # 通過文件的read()讀取所返回的內容 ''' total 4 -rw-rw-r-- 1 tengjian tengjian 0 11月 5 09:32 a.txt -rw-rw-r-- 1 tengjian tengjian 81 11月 5 09:32 python_shell.py '''
對于那些沒有返回指的shell命令,我依然也可以使用popen()方法,如下:
import os f=os.popen("touch b.txt") # 創(chuàng)建一個文件 # f=os.popen("mkdir newdir") # 創(chuàng)建一個新的文件夾 print(f.read()) # 無返回值
總結:
- 對于有返回值的shell命令,建議使用 os.popen()
- 對于沒有返回值的shell命令,建議使用 os.system()
當然除了python系統(tǒng)自帶的os模塊的這兩個方法,還有很多其他的方法可以實現(xiàn)shell命令操作,下面介紹幾個。
三、通過subprocess模塊
subprocess模塊是python從2.4版本開始引入的模塊,也是系統(tǒng)自帶的,不需要再額外安裝了。主要用來取代 一些舊的模塊方法,如os.system、os.spawn*、os.popen*、commands.*等。subprocess通過子進程來執(zhí)行外部指令,并通過input/output/error管道,獲取子進程的執(zhí)行的返回信息。
1 常用方法:
(1)subprocess.call():執(zhí)行命令,并返回執(zhí)行狀態(tài),其中shell參數(shù)為False時,命令以及命令的參數(shù)需要通過列表的方式傳入,當shell為True時,可通過一個字符串直接傳入命令以及命令所需要的參數(shù)
示例如下:
import subprocess print(subprocess.call(["ls","-l"],shell=False)) # shell參數(shù)為false,則,命令以及參數(shù)以列表的形式給出 ''' total 8 -rw-rw-r-- 1 tengjian tengjian 0 11月 5 09:32 a.txt -rw-rw-r-- 1 tengjian tengjian 0 11月 5 09:33 b.txt drwxrwxr-x 2 tengjian tengjian 4096 11月 5 09:32 hahaha -rw-rw-r-- 1 tengjian tengjian 119 11月 5 10:22 python_shell.py 0 '''
最后一個狀態(tài)0,表示命令執(zhí)行成功。
import subprocess a=subprocess.call(["ls","-l"],shell=False) # shell參數(shù)為false,則,命令以及參數(shù)以列表的形式給出 print(a) ''' 0 此時只返回0表示執(zhí)行成功 '''
當shell參數(shù)為True的時候:
import subprocess print(subprocess.call("ls -l",shell=True)) # shell參數(shù)為true,則,命令以及參數(shù)以字符串的形式給出 ''' total 8 -rw-rw-r-- 1 tengjian tengjian 0 11月 5 09:32 a.txt -rw-rw-r-- 1 tengjian tengjian 0 11月 5 09:33 b.txt drwxrwxr-x 2 tengjian tengjian 4096 11月 5 09:32 hahaha -rw-rw-r-- 1 tengjian tengjian 119 11月 5 10:22 python_shell.py 0 '''
當然對于一些沒有返回值的shell命令,也可以同樣的操作,如下:
import subprocess print(subprocess.call(["touch","c.txt"],shell=False)) # 直接返回0,表示操作成功 print(subprocess.call(["mkdir newdir1"],shell=True)) # 直接返回0,表示操作成功
(2)subprocess.check_call():用法與subprocess.call()類似,區(qū)別是,當返回值不為0時,直接拋出異常,這里不再贅述了。
(3)subprocess.check_output():用法與上面兩個方法類似,區(qū)別是,如果當返回值為0時,直接返回輸出結果,如果返回值不為0,直接拋出異常。需要說明的是,該方法在python3.x中才有。
import os import subprocess a=subprocess.check_output(["ls","-l"],shell=False) print(a) # 不是直接返回0了,而是直接返回執(zhí)行結果的內容 ''' b'total 8\n-rw-rw-r-- 1 tengjian tengjian 0 11\xe6\x9c\x88 5 09:32 a.txt\n-rw-rw-r-- 1 tengjian tengjian 0 11\xe6\x9c\x88 5 09:33 b.txt\n-rw-rw-r-- 1 tengjian tengjian 0 11\xe6\x9c\x88 5 10:25 c.txt\ndrwxrwxr-x 2 tengjian tengjian 4096 11\xe6\x9c\x88 5 09:32 hahaha\n-rw-rw-r-- 1 tengjian tengjian 181 11\xe6\x9c\x88 5 10:33 python_shell.py\n' '''
注意:subprocess的功能還有更多,比如還有Popen類
subprocess模塊中定義了一個Popen類,通過它可以來創(chuàng)建進程,并與其進行復雜的交互
四、通過sh庫
首先安裝sh庫 :pip install sh
Python 是一種偉大的腳本語言,不過有時使用標準 os 和 subprocess 庫會有點棘手。
sh 庫提供了一種不錯的替代方案。
sh 庫:http://amoffat.github.io/sh/
庫允許用戶像使用普通函數(shù)一樣調用任意程序,這對自動化工作流和任務非常有用。
它的一般工作模式如下:
sh.command_name("參數(shù)一","參數(shù)二","參數(shù)三")
import sh sh.pwd() sh.mkdir( new_folder ) sh.touch( new_file.txt ) sh.whoami() sh.echo( This is great! ) sh.ls("-l") ? ? ? ? # 等價于 ls -l print(sh.ls("-l")) sh.df("-h") ? ? ? ? # 等價于 df -h print(sh.df("-h")) # 當有多個參數(shù)的情況,且參數(shù)可以賦值 sh.du("-h","-d 1") ?# 等價于 du -h -d 1 print(sh.du("-h","-d 1"))
注意:上面在通過 sh.** 編寫的時候可能沒有代碼提示,因為sh模塊里面并沒有直接定義 像上面的
pwd(),touch(),du()等這些函數(shù),他是通過其他的方式實現(xiàn)的,所以沒有智能敏感提示。
到此這篇關于python執(zhí)行shell腳本的四種方法的文章就介紹到這了,更多相關python執(zhí)行shell腳本內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Django app配置多個數(shù)據(jù)庫代碼實例
這篇文章主要介紹了Django app配置多個數(shù)據(jù)庫代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-12-12Python爬取英雄聯(lián)盟MSI直播間彈幕并生成詞云圖
很開心RNG最近在英雄聯(lián)盟季中賽奪冠了,特地爬取了直播間彈幕并生成詞云圖,大家一起開心一下,看看奪冠時大家都在說什么,需要的朋友可以參考下2021-06-06Python實現(xiàn)讀取郵箱中的郵件功能示例【含文本及附件】
這篇文章主要介紹了Python實現(xiàn)讀取郵箱中的郵件功能,可讀取郵件文本及附件的功能,涉及Python針對郵件的獲取、分析、保存等相關操作技巧,需要的朋友可以參考下2017-08-08