亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時間:2023年06月21日 09:51:20   作者:LoveMIss-Y  
在Python中提供了很多的方法可以調用并執(zhí)行shell腳本,本文主要介紹了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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論