python执行shell脚本的四种方法

 更新时间:2023年06月21日 09:51:20   作者:LoveMIss-Y  
在Python中提供了很多的方法可以调用并执行shell脚本,本文主要介绍了python执行shell脚本的四种方法,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧

前言:Python作为一门脚本语言,有时候需要与shell命令交互式使用,在Python中提供了很多的方法可以调用并执行shell脚本,本文做一个简单的总结。本文的开发环境是Ubuntu16.04.

一、os.system(“command”)

这是python自带的执行shell命令的方法,其中最后一个0是这个命令的返回值,为0表示命令执行成功。但是使用system()无法将执行的结果保存起来。

如下:

import os
print(os.system("touch a.txt"))

会返回一个0,表示执行成功了,然后在当前文件夹之下创建了一个新的a.txt文件

再如:

import os
print(os.system("ls -a"))

它也会返回一个0,但是这个命令执行的结果却没有办法查看,即system函数不返回shell命令执行的结果。

二、os.popen("command")方法 

上面的os.system()方法没办法查看shell命令返回的结果,通过 os.popen() 返回的是 file read 的对象,对其进行读取 read() 的操作可以看到执行的输出。

注意: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")    # 创建一个文件
# f=os.popen("mkdir newdir") # 创建一个新的文件夹
print(f.read())              # 无返回值

总结:

  • 对于有返回值的shell命令,建议使用 os.popen()
  • 对于没有返回值的shell命令,建议使用 os.system()

当然除了python系统自带的os模块的这两个方法,还有很多其他的方法可以实现shell命令操作,下面介绍几个。

三、通过subprocess模块

subprocess模块是python从2.4版本开始引入的模块,也是系统自带的,不需要再额外安装了。主要用来取代 一些旧的模块方法,如os.system、os.spawn*、os.popen*、commands.*等。subprocess通过子进程来执行外部指令,并通过input/output/error管道,获取子进程的执行的返回信息。

1 常用方法:

(1)subprocess.call():执行命令,并返回执行状态,其中shell参数为False时,命令以及命令的参数需要通过列表的方式传入,当shell为True时,可通过一个字符串直接传入命令以及命令所需要的参数

示例如下:

import subprocess
print(subprocess.call(["ls","-l"],shell=False))  # shell参数为false,则,命令以及参数以列表的形式给出
'''
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
'''

最后一个状态0,表示命令执行成功。

import subprocess
a=subprocess.call(["ls","-l"],shell=False) # shell参数为false,则,命令以及参数以列表的形式给出
print(a)
'''
0  此时只返回0表示执行成功
'''

当shell参数为True的时候:

import subprocess
print(subprocess.call("ls -l",shell=True))  # shell参数为true,则,命令以及参数以字符串的形式给出
'''
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()类似,区别是,当返回值不为0时,直接抛出异常,这里不再赘述了。

(3)subprocess.check_output():用法与上面两个方法类似,区别是,如果当返回值为0时,直接返回输出结果,如果返回值不为0,直接抛出异常。需要说明的是,该方法在python3.x中才有。

import os
import subprocess
a=subprocess.check_output(["ls","-l"],shell=False)
print(a)  # 不是直接返回0了,而是直接返回执行结果的内容
'''
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类,通过它可以来创建进程,并与其进行复杂的交互

四、通过sh库

首先安装sh库 :pip install sh

Python 是一种伟大的脚本语言,不过有时使用标准 os 和 subprocess 库会有点棘手。

sh 库提供了一种不错的替代方案。

sh 库:http://amoffat.github.io/sh/

库允许用户像使用普通函数一样调用任意程序,这对自动化工作流和任务非常有用。

它的一般工作模式如下:

sh.command_name("参数一","参数二","参数三")

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.du("-h","-d 1")  # 等价于 du -h -d 1
print(sh.du("-h","-d 1"))

注意:上面在通过 sh.** 编写的时候可能没有代码提示,因为sh模块里面并没有直接定义 像上面的

pwd(),touch(),du()等这些函数,他是通过其他的方式实现的,所以没有智能敏感提示。

到此这篇关于python执行shell脚本的四种方法的文章就介绍到这了,更多相关python执行shell脚本内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • OpenCV机器学习MeanShift算法笔记分享

    OpenCV机器学习MeanShift算法笔记分享

    这篇文章主要介绍了OpenCV机器学习MeanShift算法笔记分享,有需要的朋友可以借鉴参考下,希望可以对各位读者的OpenCV算法学习能够有所帮助
    2021-09-09
  • Python处理PDF及生成多层PDF实例代码

    Python处理PDF及生成多层PDF实例代码

    Python提供了众多的PDF支持库,本篇文章主要介绍了Python处理PDF及生成多层PDF实例代码,这样就能够实现图片扫描上来的内容也可以进行内容搜索的目标
    2017-04-04
  • 简单总结Python中序列与字典的相同和不同之处

    简单总结Python中序列与字典的相同和不同之处

    这篇文章主要介绍了Python中序列与字典的相同和不同之处,序列这里讲到Python中最常用的列表和元组以及字典三种,需要的朋友可以参考下
    2016-01-01
  • python中的编码和解码及\x和\u问题

    python中的编码和解码及\x和\u问题

    这篇文章主要介绍了python中的编码和解码及\x和\u问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • python requests 使用快速入门

    python requests 使用快速入门

    这篇文章主要介绍了python requests 使用快速入门教程,使用 Requests 发送网络请求非常简单,具体操作方法,大家参考下本文吧
    2017-08-08
  • python中实现修改图像分辨率大小

    python中实现修改图像分辨率大小

    这篇文章主要介绍了python中实现修改图像分辨率大小问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • python版飞机大战代码分享

    python版飞机大战代码分享

    这篇文章主要为大家详细介绍了python版飞机大战的实现代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • python 禁止函数修改列表的实现方法

    python 禁止函数修改列表的实现方法

    下面小编就为大家带来一篇python 禁止函数修改列表的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • 一文详解如何在Matplotlib中更改图例字体大小

    一文详解如何在Matplotlib中更改图例字体大小

    在我们处理数据的时候,需要对大量的数据进行绘图,就免不了要使用到Matplotlib,下面这篇文章主要给大家介绍了关于如何在Matplotlib中更改图例字体大小的相关资料,需要的朋友可以参考下
    2023-05-05
  • 详解Python prometheus_client使用方式

    详解Python prometheus_client使用方式

    本文主要介绍了Python prometheus_client使用方式,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02

最新评论