python subprocess.run 详解

一、详解

subprocess.run 是 Python 3.5 及以上版本中引入的一个函数,用于运行子进程。它是 subprocess 模块的一部分,提供了一种更简单和更强大的方式来创建和管理子进程。subprocess.run 函数可以替代旧的 os.system 和 subprocess.call 等函数。

以下是 subprocess.run 函数的详细解释:

1.1、基本用法

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


在这个例子中,subprocess.run 执行了 ls -l 命令,并等待命令完成。

1.2、参数详解

  • args: 要执行的命令及其参数。可以是一个字符串或一个字符串列表。
  • stdin, stdout, stderr: 分别表示标准输入、标准输出和标准错误。可以是 subprocess.PIPE、文件对象或文件描述符。
  • input: 传递给子进程的输入数据。
  • timeout: 子进程的超时时间(以秒为单位)。如果子进程在指定时间内没有完成,将抛出 subprocess.TimeoutExpired 异常。
  • check: 如果设置为 True,并且子进程返回一个非零退出状态码,将抛出 subprocess.CalledProcessError 异常。
  • encoding: 如果指定了 encoding,则 stdin, stdout, stderr 将被解码为字符串。
  • errors: 用于指定如何处理解码错误。
  • shell: 如果设置为 True,将通过 shell 执行命令。
  • cwd: 设置子进程的当前工作目录。
  • env: 用于指定子进程的环境变量。

1.3、返回值

subprocess.run 返回一个 CompletedProcess 对象,包含以下属性:

  • args: 执行的命令及其参数。
  • returncode: 子进程的退出状态码。
  • stdout: 子进程的标准输出(如果 stdout 参数设置为 subprocess.PIPE)。
  • stderr: 子进程的标准错误(如果 stderr 参数设置为 subprocess.PIPE)。

1.4、示例

捕获输出

result = subprocess.run(['ls', '-l'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
print(result.stdout)

处理错误

try:result = subprocess.run(['ls', '-l', '/nonexistent'], check=True)
except subprocess.CalledProcessError as e:print(f"Error: {e}")

使用超时

try:result = subprocess.run(['sleep', '10'], timeout=5)
except subprocess.TimeoutExpired as e:print(f"Timeout: {e}")

通过 shell 执行命令

result = subprocess.run('echo $HOME', shell=True, text=True)print(result.stdout)

1.5、总结

subprocess.run 提供了一种灵活且强大的方式来执行子进程,并且可以通过各种参数来控制子进程的行为和处理其输出。通过合理使用这些参数,可以满足大多数子进程管理的需求。

二、subprocess.run执行python文件

在 Python 中,你可以使用 subprocess.run 来执行另一个 Python 文件。subprocess.run 是 Python 3.5 及以上版本中推荐的用于运行子进程的函数。下面是一个示例,展示了如何使用 subprocess.run 来执行另一个 Python 文件:

假设你有一个名为 script_to_run.py 的 Python 文件,你想从另一个 Python 脚本中运行它。

1、创建一个名为 script_to_run.py 的文件,并在其中编写一些代码,例如:

# script_to_run.py
print("Hello from script_to_run.py!")

2、创建另一个 Python 文件,例如 main_script.py,并在其中使用 subprocess.run 来执行 script_to_run.py:

# main_script.py
import subprocess# 使用 Python 解释器执行 script_to_run.py
result = subprocess.run(['python', 'script_to_run.py'], capture_output=True, text=True)# 打印子进程的输出
print("Output of script_to_run.py:")
print(result.stdout)# 打印子进程的错误输出(如果有)
if result.stderr:print("Errors:")print(result.stderr)


在这个示例中,subprocess.run 函数的参数解释如下:

  • ['python', 'script_to_run.py']:这是一个列表,包含要执行的命令和参数。在这里,我们使用 python 解释器来运行 script_to_run.py 文件。
  • capture_output=True:这个参数告诉 subprocess.run 捕获子进程的标准输出和标准错误。
  • text=True:这个参数告诉 subprocess.run 将输出和错误作为字符串而不是字节返回。

运行 main_script.py,你应该会看到以下输出:

Output of script_to_run.py:
Hello from script_to_run.py!

如果 script_to_run.py 中有任何错误输出,它们也会被捕获并打印出来。

请注意,如果你使用的是 Python 3.6 或更高版本,你可以使用 subprocess.run 的 check=True 参数来自动检查子进程的返回码,并在子进程返回非零状态码时引发 subprocess.CalledProcessError 异常:

# main_script.py
import subprocesstry:result = subprocess.run(['python', 'script_to_run.py'], capture_output=True, text=True, check=True)print("Output of script_to_run.py:")print(result.stdout)
except subprocess.CalledProcessError as e:print("Errors:")print(e.stderr)

这样可以更方便地处理子进程执行失败的情况。

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

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

相关文章

贴代码框架PasteForm特性介绍之markdown和richtext

简介 PasteForm是贴代码推出的 “新一代CRUD” ,基于ABPvNext,目的是通过对Dto的特性的标注,从而实现管理端的统一UI,借助于配套的PasteBuilder代码生成器,你可以快速的为自己的项目构建后台管理端!目前管…

【RK3588 Linux 5.x 内核编程】-内核中的链表(Linked List)及使用

内核中的链表(Linked List)及使用 文章目录 内核中的链表(Linked List)及使用1、Linked List介绍2、Linux内核中的链表3、链表的操作3.1链表初始化3.2 创建节点3.3 添加节点3.4 删除节点3.5 替换节点3.6 移动节点3.7 链表旋转3.8 链表检测3.9 链表分割与合并3.10 链表遍历4、驱…

永夜星河主题特效2(星河背景 + 闪烁文字+点击星星 + 文字弹出特效)

目录 图片展示 星河背景 闪烁文字点击星星 文字弹出特效 特效介绍&#xff1a; 使用方式&#xff1a; 图片展示 星河背景 闪烁文字点击星星 文字弹出特效 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8">&l…

通过JS实现下载图片到本地教程分享

今天分享的这个方法我之前自己试了一下&#xff0c;感觉还行&#xff0c;原理就是通过<a>标签的新增属性实现的&#xff0c;然后可以强制触发下载功能&#xff0c;废话不多说&#xff0c;直接上教程。 首先在HTML写下面的代码: <a href"img.jpg" download…

Harmony错题本--@Preview标注上依然无法预览

初学HarmonyOs开发&#xff0c;写了一个超级简单的组件&#xff0c;但是代码上没有什么问题&#xff0c;DevEco Studio却无法完成预览 代码如下&#xff1a; // 单纯的右键-> ArkTsFile的话&#xff0c;可以创建一个组件。 // 原因是&#xff0c;之前我们学过通过右键->…

【linux学习指南】VSCode部署Ubantu云服务器,与Xshell进行本地通信文件编写

文章目录 &#x1f4dd;前言&#x1f320; 步骤&#x1f309;测试同步 &#x1f6a9;总结 &#x1f4dd;前言 本文目的是讲使用Vscode连接Ubantu,与本地Xshell建立通信同步文件编写。 查看本机系统相关信息&#xff1a; cat /etc/lsb*DISTRIB_IDUbuntu: 表示这是 Ubuntu 发行…

ES-针对某个字段去重后-获取某个字段值的所有值

针对上面表的数据&#xff0c;现在想根据age分组&#xff0c;并获取每个分组后的name有哪些(去重后)。 select age, GROUP_CONCAT(DISTINCT(name)) from testtable group by age ; 结果&#xff1a; 如果想要增加排序&#xff1a; SELECT age, GROUP_CONCAT(DISTINCT name)…

基于java+SpringBoot+Vue的在线考试系统设计与实现

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis Maven mysql5.7或8.0等等组成&#x…

一文详细深入总结服务器选型

1. 题记&#xff1a; 服务器选型工作是项目规划检讨的一项非常重要的工作&#xff0c;本文详细深入总结服务器选型。 2. 服务器基础知识概览 2.1 服务器的定义与功能 2.1 .1 定义 服务器是一种高性能计算机&#xff0c;其设计目的是在网络中提供服务。它可以处理来自多个客…

Linux 入门——基本指令1

目录 一背景知识的简介 二 入门相关指令的使用 一.背景知识的简介 1.认识 Linux &#xff0c;了解Linux 的相关背景 其实Linux 是从 Unix 发展而来的。 Linux&#xff0c;一般指GNU/Linux&#xff08;单独的Linux内核并不可直接使用&#xff0c;一般搭配GNU套件&#xff0…

2024年数维杯国际赛赛题浅析-助攻快速选题

本届数维杯我们将选择 MCM的B题以及ICM的D题进行助攻&#xff0c;具体助攻时间轴如下所示 11.15 12&#xff1a;00 更新赛题翻译、相关文献资料、选题建议、赛题难度 11.15 16&#xff1a;00 更新人工精翻版本赛题、数据预处理代码 11.15 24&#xff1a;00 更新完整解题思路…

w038基于SpringBoot的网上租赁系统设计与实现

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0…

windows 安装Ubuntu 后如何使用

windows 安装Ubuntu 后如何使用 youtube链接 https://www.youtube.com/watch?vPaEcQmgEz78哔哩哔哩视频 https://www.bilibili.com/video/BV1tW42197za/?spm_id_from333.999.0.0两个视频是一样的安装Ubuntu 安装docker的教程&#xff0c;不执行docker的安装即可 安装完毕后…

HashMap面试知识点

一、HashMap实现原理 JDK1.7之前&#xff1a;HashMap由数组链表组成。 JDK1.8之后&#xff1a;HashMap由数组链表、红黑树组成&#xff0c;当链表长度超过8&#xff0c;且 二、HashMap中put()方法的过程 ①首先检查数组table是否为空&#xff0c; 为空的话通过resize()方法进…

OceanBase 闪回查询

前言 在OB中&#xff0c;drop表可以通过 回收站 或者 以往的备份恢复来还原单表。当delete数据时&#xff0c;由于delete操作的对象不会进入回收站&#xff0c;此时需要通过闪回查询功能查看delete的数据&#xff0c;以便后续恢复 本次实验版本为 OceanBase 4.2.1.8&#xff0…

[A-18]ARMv8/ARMv9-Memory-内存空间的属性(Attributes Properties)

ver0.1 [看前序文章有惊喜,关注“浩瀚架构师”,可以解锁全部文章] 前言 在宏伟的ARM的内存世界中VMSA中,属性这个议题算不上最亮的星,就和屏幕前的你和我一样,平凡的活在这个茫茫然的人世间。纵使“丈夫贫践应未足,今日相逢无酒钱。”,也不要灰心面对生活,因为“山重…

【Linux】--环境变量

大家好呀&#xff0c;我是残念&#xff0c;希望在你看完之后&#xff0c;能对你有所帮助&#xff0c;有什么不足请指正&#xff01;共同学习交流哦 本文由&#xff1a;残念ing原创CSDN首发&#xff0c;如需要转载请通知 个人主页&#xff1a;残念ing-CSDN博客&#xff0c;欢迎各…

vue3中使用 HTML5 Canvas 做一个案例总结笔记

这篇文章记录了在vue3中如何使用HTML5 Canvas做一个时钟的案例, 当然主要是HTML5 Canvas, 如何需要了解更多关于vue的知识前面也已经写过好几篇了,辛苦翻一下的... 开始写代码之前我们先来了解一下关于HTML5 Canvas 的基础知识 目录 一 .基础知识 1.了解canvas 1.1 基本用法…

基于微信小程序的开放实验室预约管理系统的设计与实现,LW+源码+讲解

摘 要 使用旧方法对开放实验室预约管理系统的信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在开放实验室预约管理系统的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题…

【汇编语言】更灵活的定位内存地址的方法(二)—— 从 [bx+idata] 到 [bx+si+idata]:让你灵活的访问内存

文章目录 前言1. [bxidata]1.1 更加灵活的访问内存1.2 示例1.3 问题一1.4 问题一的分析与求解 2. 用[bxidata]的方式进行数组的处理2.1 问题引入2.2 原来的解决方案2.3 新的解决方案2.3.1 改进后的程序2.3.2 还可以写成这样2.3.3 用C语言来描述看看 2.4 比较与总结 3. SI和DI3.…