python执行linux系统命令的三种方式小结

 更新时间:2024年02月02日 10:04:16   作者:神的孩子都在歌唱  
本文介绍三种在python执行linux命令的方式,三种方式都是基于python的标准库实现,因此不需要额外安装第三方库,具有一定的参考价值,感兴趣的可以了解一下

前言

这是我在这个网站整理的笔记,有错误的地方请指出

1. 使用os.system

 os.system(cmd),其中cmd就是需要执行的linux命令。该方式会阻塞主进程,直到命令执行结束并返回状态,如果返回的状态值为0,表示命令正常执行,如果不为0,则表示命令执行异常。要注意的是,该方式执行linux命令,会直接打印出命令执行的结果,但是不会作为对象返回,因此程序无法直接获取命令执行的结果。

无法获取命令执行后的返回信息

import os

os.system('ls')

image-20240131221444134

2. 使用os.popen

os.popen(cmd)方式,不会阻塞主进程,执行命令的子进程会和主进程同步运行,如果想要进行阻塞,等到命令执行完再执行下一步,可以通过os.wait()函数等到子进程执行完毕。

os.popen()会返回一个对象,该对象可文件对象类似,支持文件对象的读写接口,该对象会保存命令执行的结果,可以通过对象的read()函数获取结果内容。因此,该方式相比于os.system()的特点是,不阻塞子进程,可以直接获取命令执行的结构。

能够获取命令执行后的返回信息

import os

data=os.popen('ls').readlines()
print(data)

image-20240131221624726

3. 使用模块 subprocess

subprocess.Popen(args,shell=True,stdout=f),其中args可以为字符串,也可以为一个列表,如果是字符串,那么会将其认为是可执行程序直接运行,如果是一个列表,则会将其当做是空格隔开的shell命令,此时需要将shell参数设为True,才行。例如subprocess.Popen(['ps','-ef'],shell=True),会显示所有的进程。这里需要注意的是,这里默认环境是当前主进程,因此只会显示当前主进程下所有的进程信息,而不是整个系统的进程信息。subprocess.Popen()返回的对象具有多个方法,默认该方式对于命令执行是非阻塞的,但是可以通过p.wait()进行阻塞,其中p表示返回的对象,还可以通过pid属性获取进程号,kill()方法直接结束进程等。

此外,对于命令的执行结果,默认是直接打印出来,还可以通过stdout参数重定向到文件中,比如设置stdout参数为一个文件对象,就可以将结果输出到文件中。如果该文件同时支持读取模式,那么还可以先将文件指针seek到指定位置再读取命令执行后的输出结果。(因为写入输出结果后,文件指针在文件最后,因此直接读取是无法读到内容的,所以需要先seek到指定位置,比如0位置,才能读取)

通过subprocess模块可以更灵活地执行命令,并获取执行后的返回信息。

import subprocess

# 使用Popen执行命令,并捕获标准输出
result = subprocess.Popen('ls', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

# 读取并解码标准输出
output_bytes = result.stdout.read()
output_str = output_bytes.decode('utf-8')

# 输出结果
print(output_str)

# 或者逐行输出结果
for line in output_str.splitlines():
    print(line)

image-20240131222135088

参数解释:

  • shell=True:指示在shell中运行命令。
  • stdout=subprocess.PIPE:捕获命令的标准输出。
  • stderr=subprocess.STDOUT:将标准错误输出重定向到标准输出。

通过使用subprocess模块,可以更方便地处理命令执行的输出,并在需要时对其进行进一步处理。

到此这篇关于python执行linux系统命令的三种方式小结的文章就介绍到这了,更多相关python执行linux系统命令内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python使用Berkeley DB数据库实例

    python使用Berkeley DB数据库实例

    这篇文章主要介绍了python使用Berkeley DB数据库的方法,以实例形式讲述了完整的操作过程,并总结了具体的操作步骤,非常具有实用性,需要的朋友可以参考下
    2014-09-09
  • 深入解析Python中的__builtins__内建对象

    深入解析Python中的__builtins__内建对象

    __builtins__ 是内建模块__builtin__中的对象,使用Python中的内建函数时会通过__builtins__引导,这里我们就来深入解析Python中的__builtins__内建对象,需要的朋友可以参考下
    2016-06-06
  • Pygame游戏开发之太空射击实战入门篇

    Pygame游戏开发之太空射击实战入门篇

    相信大多数8090后都玩过太空射击游戏,在过去游戏不多的年代太空射击自然属于经典好玩的一款了,今天我们来自己动手实现它,在编写学习中回顾过往展望未来,下面开始入门篇
    2022-08-08
  • 详解解决Python memory error的问题(四种解决方案)

    详解解决Python memory error的问题(四种解决方案)

    这篇文章主要介绍了详解解决Python memory error的问题(四种解决方案),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • python如何实现排序,并标上序号

    python如何实现排序,并标上序号

    这篇文章主要介绍了python如何实现排序,并标上序号,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Python和OpenCV进行多尺度模板匹配实现

    Python和OpenCV进行多尺度模板匹配实现

    本文将实现如何将标准模板匹配扩展到多尺度,使其可以处理模板和输入图像大小不同的匹配。具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Flask框架通过Flask_login实现用户登录功能示例

    Flask框架通过Flask_login实现用户登录功能示例

    这篇文章主要介绍了Flask框架通过Flask_login实现用户登录功能,结合实例形式较为详细的分析了flask框架使用Flask_login实现用户登陆功能的具体操作步骤、相关实现技巧与操作注意事项,需要的朋友可以参考下
    2018-07-07
  • python文件和目录操作方法大全(含实例)

    python文件和目录操作方法大全(含实例)

    这篇文章主要介绍了python文件和目录的操作方法,简明总结了文件和目录操作中常用的模块、方法,并列举了一个综合实例,需要的朋友可以参考下
    2014-03-03
  • linux环境打包python工程为可执行程序的过程

    linux环境打包python工程为可执行程序的过程

    本次需求,在ubuntu上面开发的python代码程序需要打包成一个可执行程序然后交付给甲方,因为不能直接给源码给甲方,所以寻找方法将python开发的源码打包成一个可执行程序,本次在ubuntu上打包python源码的方法和在window上打包的有点类似,感兴趣的朋友跟随小编一起看看吧
    2024-01-01
  • 在python中使用requests 模拟浏览器发送请求数据的方法

    在python中使用requests 模拟浏览器发送请求数据的方法

    今天小编就为大家分享一篇在python中使用requests 模拟浏览器发送请求数据的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12

最新评论