python subprocess执行外部命令常用方法详细举例

 更新时间:2023年12月26日 10:56:06   作者:爱吃肉真是太好了呀  
这篇文章主要给大家介绍了关于python subprocess执行外部命令常用方法的相关资料,Python的subprocess模块提供了一种在Python中调用外部命令的方法,文中通过代码介绍的非常详细,需要的朋友可以参考下

前言

subprocess模块是Python标准库中的一个模块,用于创建和控制子进程。它提供了一种在Python程序中调用其他外部命令、执行系统命令和与系统进程进行交互的方法。常用的有两种方法:subprocess.run(),subprocess.Popen()

1. subprocess.run()方法

subprocess.run()是subprocess模块中一个常用的函数,也是官方推荐的方法,它用于运行命令并等待其完成。

subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, shell=False, timeout=None, check=False, encoding=None, errors=None, text=None, cwd=None, env=None, universal_newlines=None) 

常用参数说明:

  • args:要执行的命令及其参数组成的列表或字符串。
  • stdin:标准输入流(默认为None)。
  • input:作为子进程的输入发送的数据(默认为None)。
  • stdout:标准输出流(默认为None,表示将输出传递给父进程)。
  • stderr:标准错误流(默认为None,表示将错误信息传递给父进程)。
  • shell:是否通过系统shell执行命令(默认为False,即不使用shell执行)。
  • timeout:超时时间,指定子进程允许执行的最长时间(默认为None)。
  • check:如果子进程返回非零状态码,则抛出CalledProcessError异常(默认为False)。
  • cwd:子进程的当前工作目录(默认为None,表示使用父进程的当前工作目录)。

subprocess.run()的详细用法介绍

示例1:运行命令并等待其完成

import subprocess

subprocess.run(['ls', '-l'])

执行结果:

示例2:通过shell执行命令

import subprocess

subprocess.run('echo Hello, World!', shell=True)

执行结果:

示例3:传递输入给子进程

import subprocess

subprocess.run(['grep', 'hello'], input=b'Hello, world!\nHello, Python!')
打印结果:
![](http://rxfj6v915.hn-bkt.clouddn.com/FjLlvbwamnPX_cS27QZph2vSQ7aM)

示例4:设置超时时间

import subprocess

try:
    subprocess.run(['sleep', '10'], timeout=5)
except subprocess.TimeoutExpired:
    print("Timeout reached")

打印结果:

示例5:指定工作目录

import subprocess

subprocess.run(['ls', '-l'], cwd='/opt/')

打印结果:

示例6:check

import subprocess

subprocess.run(['ls','huaei'], cwd='/opt/', check=True)

打印结果:

示例7:捕获脚本的输出

# 使用管道捕获输出
a = subprocess.run('ls /opt/huawei', shell=True, stdout=subprocess.PIPE)

打印结果:

2. subprocess.Popen()方法

subprocess.Popen()是subprocess模块中用于创建子进程的函数之一。它提供了更灵活的控制和处理子进程的能力。

subprocess.Popen(args, bufsize=-1, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=True, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0, restore_signals=True, start_new_session=False, pass_fds=(), *, encoding=None, errors=None) 

常用参数说明:

  • args:要执行的命令及其参数组成的列表或字符串。
  • executable:可执行文件路径或命令名称(默认为None)。
  • stdin:标准输入流(默认为None)。
  • stdout:标准输出流(默认为None)。
  • stderr:标准错误流(默认为None)。
  • preexec_fn:子进程创建前要调用的可调用对象(默认为None)。
  • close_fds:在子进程中关闭不必要的文件描述符(默认为True)。
  • shell:是否通过系统shell执行命令(默认为False)。
  • cwd:子进程的当前工作目录(默认为None,表示使用父进程的当前工作目录)。
  • env:子进程的环境变量(默认为None,表示使用父进程的环境变量)。
  • universal_newlines:各种换行符统一成’\n’。

subprocess.Popen()的详细用法介绍

示例1:运行命令并捕获输出

import subprocess

process = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE)
output, error = process.communicate()
print(output.decode())

打印结果:

示例2:传递输入给子进程并获取输出

process = subprocess.Popen(['grep', 'hello'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)

# communicate:参数是标准输入,返回标准输出和标准出错
output, error = process.communicate(input=b'hello, world!')
print(output)

打印结果:

示例3:后台执行命令

subprocess.Popen(['sleep', '10'])

打印结果:

示例4:通过shell执行命令

subprocess.Popen('echo Hello, World!', shell=True)

打印结果:

示例5:指定工作目录和环境变量

subprocess.Popen(['ls', '-l'], cwd='/path/to/directory', env={'VAR': 'value'})

poll()方法

poll(): 该方法用于检查子进程是否已经结束,并返回子进程的返回码。如果子进程尚未结束,poll()会立即返回None;如果子进程已经结束,poll()会返回子进程的返回码。这个方法通常在你需要非阻塞地检查子进程状态时使用。

import subprocess

# 启动一个子进程
process = subprocess.Popen(['echo', 'Hello, world!'], stdout=subprocess.PIPE)

# 检查子进程是否结束
return_code = process.poll()

if return_code is None:
    print("子进程尚未结束")
else:
    print(f"子进程已结束,返回码: {return_code}")

打印结果:

wait()方法

wait(): 该方法用于等待子进程的结束,并返回子进程的返回码。如果子进程尚未结束,wait()方法会阻塞当前进程直到子进程结束。这个方法通常在你需要等待子进程执行完毕并获取其返回码时使用。

import subprocess

# 启动一个子进程
process = subprocess.Popen(['sleep', '5'])

# 等待子进程结束并获取返回码
return_code = process.wait()

print(f"子进程已结束,返回码: {return_code}")

打印结果:

等待5秒钟程序执行完成,才打印返回码

总结 

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

相关文章

  • 基于Python实现开发钉钉通知机器人

    基于Python实现开发钉钉通知机器人

    在项目协同工作或自动化流程完成时,我们需要用一定的手段通知自己或他人。Telegram 非常好用,几个步骤就能创建一个机器人,可惜在国内无法使用。所以本文就来开发一个钉钉通知机器人吧
    2023-02-02
  • python使用dabl几行代码实现数据处理分析及ML自动化

    python使用dabl几行代码实现数据处理分析及ML自动化

    这篇文章主要为大家分享一个名为 dabl 的开源 Python 工具包,它可以自动化机器学习模型开发,包括数据预处理、特征可视化和分析、建模
    2021-11-11
  • 如何使用 Python 读取 Excel 数据

    如何使用 Python 读取 Excel 数据

    这篇文章主要介绍了使用 Python 读取 Excel 数据的详细教程,通过 pandas 和 openpyxl,你可以轻松读取 Excel 文件,并进行各种数据处理操作,pandas 更适合快速、简单的数据分析,而 openpyxl 则适合需要对 Excel 文件进行更深入控制的场景,需要的朋友可以参考下
    2025-04-04
  • python+requests+unittest API接口测试实例(详解)

    python+requests+unittest API接口测试实例(详解)

    下面小编就为大家带来一篇python+requests+unittest API接口测试实例(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • Python绘制动态水球图过程详解

    Python绘制动态水球图过程详解

    这篇文章主要介绍了Python绘制动态水球图过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • Python Django切换MySQL数据库实例详解

    Python Django切换MySQL数据库实例详解

    这篇文章主要介绍了Python Django切换MySQL数据库实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • 使用Python和Spire.XLS轻松实现Excel到TXT数据转换

    使用Python和Spire.XLS轻松实现Excel到TXT数据转换

    在数据处理和分析的过程中,经常需要将不同格式的数据进行转换,Excel 文件是数据存储和操作中非常常见的格式,而 TXT 文件凭借其简单的文本格式,本文将介绍如何使用 Python 和 Spire.XLS 库将 Excel 导出为 TXT 文件,需要的朋友可以参考下
    2026-02-02
  • Python全景系列之装饰器使用的全面讲解

    Python全景系列之装饰器使用的全面讲解

    装饰器在Python中扮演了重要的角色,文将深入探讨装饰器的所有相关主题,包括装饰器的基础知识、实现与使用、工作原理等,需要的可以参考一下
    2023-05-05
  • python使用matplotlib画饼状图

    python使用matplotlib画饼状图

    这篇文章主要为大家详细介绍了python使用matplotlib画饼状图,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • Python range() 函数用法详解

    Python range() 函数用法详解

    range()是python内置函数它能返回一系列连续增加的整数,它的工作方式类似于分片,可以生成一个列表对象,这篇文章主要介绍了Python range() 函数用法,需要的朋友可以参考下
    2023-03-03

最新评论