欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python執(zhí)行shell腳本的四種方法

 更新時(shí)間:2023年06月21日 09:51:20   作者:LoveMIss-Y  
在Python中提供了很多的方法可以調(diào)用并執(zhí)行shell腳本,本文主要介紹了python執(zhí)行shell腳本的四種方法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言: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)文章

最新評(píng)論