python subprocess执行外部命令常用方法

news2024/9/28 1:07:44

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秒钟程序执行完成,才打印返回码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/737836.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

回顾类与对象:掌握String探索其模拟实现的沉浸式体验

目录 一.STL简介二.string的模拟实现1.成员变量与(拷贝)构造、析构函数2.运算符重载[ ]3.添加数据与扩容4.赋值运算符重载及其他重载5.其他函数 一.STL简介 标准模板库 STL是C标准库的重要组成部分,stl分为六大组件:算法、容器、迭代器、空间适配器、仿…

NLP实战7:seq2seq翻译实战-Pytorch复现

🍨 本文为[🔗365天深度学习训练营]内部限免文章(版权归 *K同学啊* 所有) 🍖 作者:[K同学啊] 📌 本周任务: ●请根据N5、N6周内容,为解码器添加上注意力机制 一、前期准备…

常用分类损失CE Loss、Focal Loss及GHMC Loss理解与总结

一、CE Loss 定义 交叉熵损失(Cross-Entropy Loss,CE Loss)能够衡量同一个随机变量中的两个不同概率分布的差异程度,当两个概率分布越接近时,交叉熵损失越小,表示模型预测结果越准确。 公式 二分类 二…

【QT】QT搭建OpenCV环境

QT/OpenCV 01、开始之前02、QT03、CMake04、OpenCV05、配置06、测试 01、开始之前 本文版本: 1、QT:Based on Qt 5.12.2 (MSVC 2017, 32 bit),编译方式是MinGW 2、CMake:cmake-3.27.0-rc4-windows-x86_64.msi 3、OpenCV&#xff1…

2023年值得入手的开放式耳机推荐,蓝牙耳机的选购指南分享推荐

身为一个音乐爱好者,出于对音质和佩戴舒适的追求,也有入手了很多品类的耳机,其中不乏有有线耳机、无线蓝牙耳机,两种不同的音频传输方式大类,其各自所拥有的特性也是不同的。而居于后者的无线蓝牙耳机,在现…

【Java基础教程】(八)面向对象篇 · 第二讲:Java 数组全面解析——动态与静态初始化、二维数组、方法参数传递、排序与转置、对象数组、操作API~

Java基础教程之面向对象 第二讲 本节学习目标1️⃣ 概念1.1 动态初始化1.2 静态初始化 2️⃣ 二维数组3️⃣ 数组与方法参数的传递4️⃣ 数组排序5️⃣ 数组转置6️⃣ 对象数组7️⃣ 数组操作API7.1 数组复制7.2 数组排序 🌾 总结 本节学习目标 掌握数组的动态及静…

水库监测中仪器安装及监测结果的要求有哪些

水库监测点位布设需要根据水库运行情况和安全监测的需求来进行,一般分为基础监测点位和重要部位监测点位,基础监测点位主要包括上游水位、上游库水位变幅、库岸稳定以及上下游坝坡稳定等。重要部位监测点位主要包括坝轴线、溢洪道进口和泄水洞出口等部位…

前端报错:“Uncaught SyntaxError: missing ) after argument list“只是参数列表后面缺少 “)”?

报错"Uncaught SyntaxError: missing ) after argument list",字面翻译过来的意思:语法错误: 参数列表后面缺少 )。 一直以为是少了 一个小括号找了好久 发现并不是 据提示是参数列表的问题,找到文件中存在参数列表的地方。如下图…

如何利用MyBatis完成web项目的环境搭建(导入核心依赖包、日志、编译环境,配置文件以及Druid连接池)

目录 项目环境搭建 servlet实例 核心依赖 导入日志 编译环境 mapper注册 resouces中 dao中 MyBatis配置文件 实例效果 导入配置文件 Druid连接池 Druid连接池是什么? 如何配置Druid连接池? 实体类 实例效果 项目环境搭建 1.在pom.xml中…

STM32 Proteus UCOSII系统锅炉报警系统设计压力温度水位-0059

STM32 Proteus UCOSII系统锅炉报警系统设计压力温度水位-0059 Proteus仿真小实验: STM32 Proteus UCOSII系统锅炉报警系统设计压力温度水位-0059 功能: 硬件组成:51单片机 8位数码管MAX7219数码管驱动模块多个按键LED灯蜂鸣器 1.准确测量…

IronOCR for .NET 2023.7.0 Crack

IronOCR for .NET 关于 读取 .NET 应用程序中图像和 Pdf 文本的高级 OCR (光学字符识别) 库。 IronOCR for .NET enables software engineers to read text content from images & PDFs in .NET applications and Web sites. Read text and barcod…

HarmonyOS/OpenHarmony应用开发-程序包安装、卸载、更新流程

一、应用程序包安装和卸载流程 1.开发者 开发者可以通过调试命令进行应用的安装和卸载,可参考多HAP的调试流程。 图1 应用程序包安装和卸载流程(开发者) 2.终端设备用户 开发者将应用上架应用市场后,终端设备用户可以在终端设…

python_day4_dict

字典dict:键值对(无重复,无下标索引) my_dict {python: 99, java: 88, c: 77, c: 66} my_dict2 {} # 空字典 my_dict3 dict() print(f"my_dict:{my_dict},类型为:{type(my_dict)}") print(f"my_dict2:{my_dict2},类型为:…

AI应用系列--- TalkingPhoto 会说话的照片

利用HeyGen的服务可以生成有趣的Talkingphoto,方法有二: 1、访问HeyGen - AI Video Generator 网站,登录后即可根据提示或者案例生成talkingphoto 2、是使用HeyGen的 Discord​​​​​​机器人:https://discord.com/channels/1…

MySQL数据库期末项目 图书馆管理系统

1 项目需求分析 1.1 项目名称 图书馆管理系统 1.2 项目功能 在以前大多部分图书馆都是由人工直接管理,其中每天的业务和操作流程非常繁琐复杂,纸质版的登记信息耗费了大量的人力物力。因此图书馆管理系统应运而生,该系统采用智能化设计&#…

我来为你揭秘如何将音频转文字才简单

曾经有一位聋哑人士,他很想写一本回忆录,但是因为无法听取自己的回忆录音,他不得不寻找其他方法。于是,他试着用一些软件将他的录音转成文字,但是结果却非常糟糕,充斥着大量错误和不连贯的词语。于是&#…

【大虾送书第一期】《高并发架构实战:从需求分析到系统设计》

目录 ✨写在前面 ✨足够真实的高并发系统设计场景 ✨贴合工作场景的设计文档形式 ✨求同存异的典型系统架构案例 🦐博客主页:大虾好吃吗的博客 🦐专栏地址:免费送书活动专栏地址 写在前面 很多软件工程师的职业规划是成为架构师&a…

手机副业哪些靠谱,推荐几个兼职思路

科思创业汇 大家好,这里是科思创业汇,一个轻资产创业孵化平台。赚钱的方式有很多种,我希望在科思创业汇能够给你带来最快乐的那一种! 下面给大家介绍几个靠谱的兼职项目 1.问答答主 知乎、百度、悟空等渠道做问答,…

【手把手】一篇讲清楚FastDFS的安装及使用

分布式存储发展历程 前段时间618活动火热进行,正是购物的好时机。当我们访问这些电商网站的时候,每一个商品都会有各式各样的图片展示介绍,这些图片一张两张可以随便丢在服务器的某个文件夹中,可是电商网站如此大体量的图片&…

XSS漏洞学习笔记

浏览器安全 同源策略 影响源的因素&#xff1a;host,子域名,端口,协议 a.com通过以下代码: <script scrhttp://b.com/b.js> 加载了b.com上的b.js&#xff0c;但是b.js是运行在a.com页面中的&#xff0c;因此相对于当前打开的页面(a.com)来说&#xff0c;b.js的源就应该…