使用Python执行Shell命令并获取结果

news/2025/1/8 18:56:37/文章来源:https://www.cnblogs.com/mybook000/p/18658078

使用Python执行Shell命令并获取结果是一项非常有用的技能,尤其在自动化任务、系统管理和数据处理方面。Python提供了多种方法来运行Shell命令并捕获输出,最常用的是 subprocess模块。以下是如何使用 subprocess模块执行Shell命令并获取结果的详细指南。

1. 导入 subprocess模块

首先,需要导入 subprocess模块,这是Python中执行Shell命令的标准库。

import subprocess
​
 
 

2. 使用 subprocess.run执行Shell命令

subprocess.run是执行Shell命令的推荐方法。它在Python 3.5中引入,并且比旧的 subprocess.call和 subprocess.check_output方法更强大和灵活。

示例代码

以下示例展示了如何使用 subprocess.run执行一个简单的Shell命令,并捕获其输出。

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

在这个示例中,['ls', '-l']是要执行的命令,capture_output=True表示捕获标准输出和标准错误,text=True表示将输出作为字符串处理。

3. 错误处理

执行Shell命令时,处理错误非常重要。可以使用 subprocess.run的 check参数来自动检查命令是否成功执行。

示例代码

try:result = subprocess.run(['ls', '-l'], capture_output=True, text=True, check=True)print(result.stdout)
except subprocess.CalledProcessError as e:print(f'Error occurred: {e}')
​
 
 

如果命令失败,subprocess.CalledProcessError将被抛出,并包含错误信息。

4. 捕获标准错误

有时,需要捕获和处理标准错误输出。可以通过访问 result.stderr来实现。

示例代码

result = subprocess.run(['ls', '-l', '/nonexistent_directory'], capture_output=True, text=True)
if result.returncode != 0:print(f'Error: {result.stderr}')
​
 
 

5. 执行复杂命令

可以执行更复杂的命令,包括管道和重定向。在这种情况下,需要使用 shell=True参数。

示例代码

result = subprocess.run('ls -l | grep py', shell=True, capture_output=True, text=True)
print(result.stdout)
​
 
 

注意:使用 shell=True时要小心,尤其是在处理不可信输入时,因为它可能带来安全风险。

6. 实用示例

以下是一个更实际的示例,展示如何使用Python脚本自动备份一个目录:

示例代码

import subprocess
import os# 定义要备份的目录和目标目录
source_dir = '/path/to/source'
backup_dir = '/path/to/backup'# 创建备份目录
os.makedirs(backup_dir, exist_ok=True)# 执行rsync命令进行备份
try:result = subprocess.run(['rsync', '-av', source_dir, backup_dir], capture_output=True, text=True, check=True)print('Backup successful')print(result.stdout)
except subprocess.CalledProcessError as e:print(f'Backup failed: {e.stderr}')
​
 
 

7. 分析说明表

为了更清楚地展示如何使用 subprocess模块执行Shell命令并获取结果,以下是一个分析说明表:

功能 方法与参数 示例代码
执行简单命令 subprocess.run(cmd, capture_output=True, text=True) result = subprocess.run(['ls', '-l'], capture_output=True, text=True)
错误处理 subprocess.run(cmd, capture_output=True, text=True, check=True) try: result = subprocess.run(['ls', '-l'], capture_output=True, text=True, check=True) except subprocess.CalledProcessError as e: print(f'Error occurred: {e}')
捕获标准错误 访问 result.stderr result = subprocess.run(['ls', '-l', '/nonexistent_directory'], capture_output=True, text=True); if result.returncode != 0: print(f'Error: {result.stderr}')
执行复杂命令 subprocess.run(cmd, shell=True, capture_output=True, text=True) `result = subprocess.run('ls -l
实际应用示例:自动备份 使用 rsync命令执行目录备份 try: result = subprocess.run(['rsync', '-av', source_dir, backup_dir], capture_output=True, text=True, check=True)

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

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

相关文章

特种作业操作(低压电工)实操考试资料整理

为啥去考 在B站关注城阳电工电路等赛博电工师傅们已经有一段时间了,我很喜欢看这些师傅们解决生活中的、生产上的各种电气问题,2023年春天就想去报名学,但是那时候学业很繁忙,而初证又需要去线下学习一段时间。到2024年11月发现自己这段时间突然有空,就尽快找了一家机构报…

AutoGen入门-让两个AI自行聊天完成任务

AutoGen介绍 AutoGen 是一个开源编程框架,用于构建 AI 代理并促进多个代理之间的合作以解决问题。AutoGen 旨在提供一个易于使用和灵活的框架,以加速代理型 AI 的开发和研究,就像 PyTorch 之于深度学习。它提供了诸如代理之间可以对话、LLM 和工具使用支持、自主和人机协作工…

Centos7 安装redis教程

步骤一:安装gcc依赖检查gcc是否已经安装,命令:gcc -v,出现下图说明已经安装由于 redis 是用 C 语言开发,安装之前必先确认是否安装 gcc 环境(gcc -v),如果没有安装,执行以下命令进行安装yum install -y gcc步骤二:下载redis安装包 https://download.redis.io/relea…

【编码】如何实现一套自定义网络协议?

前言 下文介绍的自定义协议仅作为学习示例,纯粹是玩具项目,没有实际可用性。无需过度关注和讨论其合理性 进行通信的双方是谁? 常见的模型 客户端-服务器,例如HTTP协议,浏览器<=>Web服务器。 中转站模型,如MQTT协议,应用服务<=>中转站<=>硬件客户端 对…

记录一个使用VsCode来ssh的问题(已经打开了ssh的一个文件夹路径,怎么新开一个文件夹路径)

一、操作 使用快捷键 Ctrl+Shift+P(Windows) 或 Cmd+Shift+P (Mac)打开 命令面板 然后输入: File:Open Folder之后就可以选项新的路径打开了。。。没想到我被这个卡了好久,有点无语。

Postman配置接口挡板

0、首先需要在postman上注册并登录账号(登录前最好先备份已有的报文) 如果你在登录后发现历史存储的报文不见了,不要担心,在退出登录后将会重新显示出来。你可以将之前备份的报文导入到登录后的workspace中使用1、进入Workspace,新建Collection 2、找到新建的collection…

vue3新建项目的DevTools Settings

找到vite.config.js 注释掉这两行就消失了

Linux文件系统的安全保障---Overlayroot!

`overlayroot` 是一种使用 OverlayFS 实现的功能,可将根文件系统挂载为只读,并通过一个临时的写层实现对文件系统的修改。这种方法非常适合嵌入式设备或需要保持系统文件完整性和安全性的场景。下文以 RK3568 平台为例,介绍制作 overlayroot 的详细步骤。 ​ 1. 制作精简文件…

DirectX 修复工具 V4.3 绿色增强版:完美解决 DirectX 和 C++ 问题,修复 0xc000007b 错误

介绍 DirectX 修复工具 V4.3 是一款高效的系统修复工具,专为解决 系统异常 和 C++ 运行库 问题而设计,尤其对解决 0xc000007b 错误有着极高的修复率。本工具支持对所有版本的 DirectX 进行修复,并在增强版中新增了对 C++ 运行库问题的修复,提供了一个全面且可靠的解决方案。…

用DevEco Studio模拟器这些能力 没真机也能高效调测鸿蒙原生应用

随着鸿蒙生态的快速发展,越来越多的开发者投身于鸿蒙原生应用的开发中。然而,在实际开发中,真机设备短缺、调测场景复杂等问题常困扰着开发者。为解决这些问题,华为在DevEco Studio上为开发者提供了模拟器(Emulator)功能,帮助开发者在真机匮乏或无真机时,高效且低成本地…

renben-openstack-使用操作

管理员操作 (1)上传一个qcow2格式的centos7镜像 (2)管理员------>云主机类型------>创建云主机类型名称:Centos7VCPU数量:1内存: 1024根磁盘: 10G其他的默认点击创建云主机类型即可界面会显示如下创建公网络 (1)创建公网管理员------>网络------>创建网络…

防护用具穿戴智能监测摄像机

防护用具穿戴智能监测摄像机在现代安全管理中扮演着越来越重要的角色。这些先进设备不仅仅是简单的监视工具,更是通过整合高级技术来提升工作效率和安全性,特别是在复杂环境和危险作业场所的应用日益广泛。防护用具穿戴智能监测摄像机不仅仅是一种安全设备,更是提升工作场所…