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