使用python执行系统命令的五种方式

在日常开发中,有时需要在Python脚本中执行系统命令,Python有五种方式来执行系统命令,推荐使用第五种。

python执行系统命令的五种方式

方法1: os.system

这是最简单的方法,适合简单的业务场景,输入为完整命令字符串,命令执行结果输出到控制台;执行成功,返回值为0,失败返回值大于0。

import os
result = os.system("ls -a")

在这里插入图片描述

方法2:os.popen

和上面一个类似,输入完整的命令字符串,但是结果不会直接输出,会保存到返回值中,调用read()可以读取结果。

import os
result = os.popen("ls -a")
print(result.read())

方法3:subprocess.run

subprocess.run 是 Python 中 subprocess 模块的一个函数,用于运行子进程。它是 Python 3.5 版本引入的。subprocess.run 提供了一种简单的方式来替代较老的 subprocess.call 函数,更方便地运行子进程并等待其完成。执行命令后,运行结果保存在CompletedProcess类实例中,并返回。更加灵活,可以将命令返回的结果输出到指定的地方,比如输出到控制台、或者日志文件等。

import subprocess# 定义要运行的命令
command = ["ls", "-l"]# 使用 subprocess.run 运行命令, 如果不设置stdout参数,会默认输出到控制台
result = subprocess.run(command, stdout=subprocess.PIPE, text=True)# 输出命令的结果
print("Return code:", result.returncode)
print("Output:\n", result.stdout)

这个例子中,我们定义了一个要运行的命令(列出当前目录的文件和文件夹),然后使用 subprocess.run 来运行它。stdout=subprocess.PIPE 参数指定将子进程的标准输出捕获,而 text=True 参数确保输出是文本形式。subprocess.run 的返回结果是一个 CompletedProcess 对象,包含了运行结果的一些信息,如返回码、标准输出等。请注意,subprocess.run 默认是同步执行的,即会等待子进程执行完成后再返回。如果你需要异步执行或更高级的控制,可以考虑使用 asyncio 模块或 subprocess.Popen 类。

stdout参数也可以设置为外部文件
在这里插入图片描述
同理,不设置stderr参数时,外部命令执行失败会直接抛出错误信息,将错误信息输出在控制台;一旦设置,则根据stderr参数进行重定向。

方法4:subprocess.call

subprocess.call 是 subprocess 模块中的一个函数,用于运行命令并等待其完成。它是相对较老的方法,而在较新版本的 Python 中,subprocess.run 被推荐用来替代 subprocess.call。这里不推荐使用也不做介绍了。

方法5:subprocess.Popen

subprocess.Popen 是 subprocess 模块中的一个类,用于创建和管理子进程。与 subprocess.call 和 subprocess.run 不同,subprocess.Popen 提供了更灵活的控制,允许你与子进程的输入、输出进行交互,以及对进程的其他方面进行更详细的配置。

下面是一个简单的使用示例:

import subprocess# 定义要运行的命令
command = ["ls", "-l"]# 使用 subprocess.Popen 创建子进程
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)# 等待子进程完成,并获取输出和错误
stdout, stderr = process.communicate()# 输出子进程的标准输出和标准错误
print("Standard Output:\n", stdout)
print("Standard Error:\n", stderr)# 获取子进程的返回码
return_code = process.returncode
print("Return code:", return_code)

在这个例子中,我们使用 subprocess.Popen 创建了一个子进程,指定了要运行的命令以及捕获标准输出和标准错误。然后,使用 communicate 方法等待子进程完成,并获取其输出和错误。

subprocess.Popen 的构造函数接受许多参数,允许你自定义子进程的各个方面。例如,你可以指定工作目录、环境变量、文件描述符、标准输入等。更多详细信息可以参考 Python 官方文档:subprocess.Popen。

需要注意的是,与 subprocess.call 和 subprocess.run 不同,subprocess.Popen 不会等待子进程完成,你需要显式调用 communicate 或其他等待方法来等待子进程完成。

总结

如果不知道用哪种就推荐使用subprocess.Popen,简单场景下用os.system就可以了。

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

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

相关文章

【IP-Adapter】进阶 - 同款人物【2】 ☑

测试模型:###最爱的模型\flat2DAnimerge_v30_2.safetensors [b2c93e7a89] 原图: 加入 control1 [IP-Adapter] 加入 control 2 [OpenPose] 通过openpose骨骼图修改人物动作。 加入 control 3 lineart 加入cotrol3 …

【LV12 DAY13 UART 串口通信】

UART–(一种通信协议) 通用异步收发器,是一种通用的串行,异步通信总线,该总线有两条数据线,可以实现全双工的发送和接收,在嵌入式系统中常用于主机与辅助设备之间的通信。 波特率 波特率用于描…

1.10 Unity中的数据存储 JSON

一、介绍 Json是最常用也是目前用的比较多的一种,超轻量级,可便捷性使用,平时用到比较多的都是解析Json和往Json中添加数据、修改数据等等JSON(JavaScript Object Notation,JS对象标记)是一种轻量级的数据交换格式,它基于ECMAScr…

Leetcode18-算术三元组的数目(2367)

1、题目 给你一个下标从 0 开始、严格递增 的整数数组 nums 和一个正整数 diff 。如果满足下述全部条件&#xff0c;则三元组 (i, j, k) 就是一个 算术三元组 &#xff1a; i < j < k &#xff0c; nums[j] - nums[i] diff 且 nums[k] - nums[j] diff 返回不同 算术三…

PR-视频去水印

文章目录 前言PR-视频去水印实现示例 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实在白嫖的话&#xff0c;那欢迎常来啊!!! PR-视频…

python绘制热力图-数据处理-VOC数据类别标签分布及数量统计(附代码)

前言 当你需要统计训练数据中每个类别标签有多少&#xff0c;并且想知道坐标中心分布在图像的位置信息时&#xff0c;你可以利用一下脚本进行计算&#xff01; 步骤 要绘制热力图来分析VOC数据的分布统计&#xff0c;可以按照以下步骤进行&#xff1a; 数据处理&#xff1…

XCTF:MISCall[WriteUP]

使用file命令&#xff0c;查看该文件类型 file d02f31b893164d56b7a8e5edb47d9be5 文件类型&#xff1a;bzip2 使用bzip2命令可对该文件进行解压 bzip2 -d d02f31b893164d56b7a8e5edb47d9be5 生成了一个后缀为.out的文件 再次使用file命令&#xff0c;查看该文件类型 file…

缓存代理服务器

1 缓存代理 1.1 缓存代理的概述 web代理的作用 缓存网页对象&#xff0c;减少重复请求 存储一些之前被访问的或且可能将要备再次访问的静态网页资源对象&#xff0c;使用户可以直接从缓存代理服务器获取资源&#xff0c;从而减少上游原始服务器的负载压力&#xff0c;加快整…

LeetCode刷题--- 地下城游戏

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 ​​​​​​http://t.csdnimg.cn/6AbpV 数据结构与算法 ​​​http://t.csdnimg.cn/hKh2l 前言&#xff1a;这个专栏主要讲述动…

在软件测试过程中如何有效的开展接口自动化测试

一.简介 接口自动化测试是指使用自动化测试工具和脚本对软件系统中的接口进行测试的过程。其目的是在软件开发过程中&#xff0c;通过对接口的自动化测试来提高测试效率和测试质量&#xff0c;减少人工测试的工作量和测试成本&#xff0c;并且能够快速发现和修复接口错误&#…

如何保护linux服务器远程使用的安全

服务器安全是一个非常敏感的问题&#xff0c;因服务器远程入侵导致数据丢失的安全问题频频出现&#xff0c;一旦服务器入侵就会对个人和企业造成巨大的损失。因此&#xff0c;在日常使用服务器的时候&#xff0c;我们需要采取一些安全措施来保障服务器的安全性。 目前服务器系…

如何在IntelliJ IDEA中配置SSH服务器开发环境并实现固定地址远程连接

文章目录 1. 检查Linux SSH服务2. 本地连接测试3. Linux 安装Cpolar4. 创建远程连接公网地址5. 公网远程连接测试6. 固定连接公网地址7. 固定地址连接测试 本文主要介绍如何在IDEA中设置远程连接服务器开发环境&#xff0c;并结合Cpolar内网穿透工具实现无公网远程连接&#xf…

某mps政务网站jsl加速乐cookie逆向解析

本文针对的目标网站如下&#xff0c;使用base64解密获得 aHR0cHM6Ly93d3cubXBzLmdvdi5jbi8 开篇&#xff1a;加速乐其实算是比较好处理的逆向问题了&#xff0c;了解过的朋友都知道&#xff0c;其本身跟瑞数相似&#xff0c;都是设置cookie后才能成功&#xff0c;设置cookie的过…

ChatGPT会给教育界带来怎样的冲击,又将与教育碰撞出怎样的火花?

11 月 7 日凌晨&#xff0c;美国人工智能公司 OpenAI 的开发者大会正式开启&#xff0c;创始人 Sam Altman 和其同事&#xff0c;发布了团队最新的成果GPT-4 Turbo&#xff0c;新一代的GPT不仅更快、有更长的上下文、而且更好的控制。而随之推出的「GPTs」——让人们能用自然语…

炫云云模型常见咨询问题TOP榜

在上一期&#xff0c;小编带大家盘点了炫云云渲染软件相关常见咨询问题。这份榜单不仅是对过去一年用户关注焦点的回顾&#xff0c;更是一个汇总了各类问题解答的宝典。无论您是初次使用还是老用户&#xff0c;都能帮助您更快速地解决疑问&#xff0c;提升使用炫云各类产品的便…

Vs2019创建c文件

每一个人都是小白开始学习的&#xff0c;学长本身在开始学习计算机编程以前&#xff0c;也是对编程语言畏之如虎&#xff0c;一头雾水。成长都是有规律的&#xff0c;&#xff0c;都是从不会到会&#xff0c;再从会到熟练。如果要问我为什么&#xff0c;唯有多练习耳&#xff0…

分布式引擎Elasticsearch本地部署并结合内网穿透远程访问

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

LeetCode-1822/1502/896/13

1.数组元素积的符号&#xff08;1822&#xff09; 题目描述&#xff1a; 已知函数 signFunc(x) 将会根据 x 的正负返回特定值&#xff1a; 如果 x 是正数&#xff0c;返回 1 。 如果 x 是负数&#xff0c;返回 -1 。 如果 x 是等于 0 &#xff0c;返回 0 。 给你一个整数数组…

详解java中ArrayList

目录 前言 一、ArrayList是什么 二、ArrayList使用 1、ArrayList的构造 2 、ArrayList常见操作 3、 ArrayList的遍历 4、 ArrayList的扩容机制 三、来个练习 前言 当你看到这篇文章我觉得很好笑&#xff0c;因为我开始也不懂ArrayList现在轮到你了&#xff0c;嘻嘻嘻&am…

Redis面试篇

redis面试题主要内容 面试官在面试时主要会问以下这些方面的问题 下面是一些问题示例&#xff1a; redis-使用场景 缓存 缓存穿透 介绍 缓存穿透&#xff1a;查询一个不存在的数据&#xff0c;mysql查询不到数据也不会直接写入缓存&#xff0c;就会导致每次请求都会去查数…