Python执行Shell命令并获取结果:深入解析与实战

简介: 通过以上内容,开发者可以在实际项目中灵活应用Python执行Shell命令,实现各种自动化任务,提高开发和运维效率。

Python执行Shell命令并获取结果:深入解析与实战

Python可以通过多种方式执行Shell命令并获取结果,常用的方式包括 subprocess模块。subprocess模块允许你生成新的进程,连接它们的输入/输出/错误管道,并获取它们的返回码。本指南将深入解析如何使用Python执行Shell命令,并提供一些实战示例。

一、subprocess模块简介

subprocess模块提供了强大的进程创建接口和与进程交互的功能。常用的方法有:

  • subprocess.run()
  • subprocess.Popen()
  • subprocess.check_output()
1. subprocess.run()

subprocess.run()是Python 3.5中引入的,推荐用于大多数情况下的Shell命令执行。

import subprocess

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

subprocess.Popen()提供更强大的功能,可以与子进程进行更细粒度的交互。

import subprocess

process = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
stdout, stderr = process.communicate()
print(stdout)
​
3. subprocess.check_output()

subprocess.check_output()用于执行命令并获取输出,如果命令返回非零值会抛出异常。

import subprocess

output = subprocess.check_output(['ls', '-l'], text=True)
print(output)
​

二、深入解析与实战

1. 基本命令执行

使用 subprocess.run()执行基本命令,并捕获输出和错误信息。

import subprocess

def execute_command(command):
    try:
        result = subprocess.run(command, capture_output=True, text=True, check=True)
        return result.stdout
    except subprocess.CalledProcessError as e:
        return f"Error: {e.stderr}"

output = execute_command(['ls', '-l'])
print(output)
​
2. 处理长时间运行的命令

使用 subprocess.Popen()处理长时间运行的命令,并实时获取输出。

import subprocess

def execute_long_running_command(command):
    process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
    for stdout_line in iter(process.stdout.readline, ""):
        print(stdout_line, end="")  # 实时输出
    process.stdout.close()
    process.wait()
    return process.returncode

return_code = execute_long_running_command(['ping', 'google.com', '-c', '4'])
print(f"Command finished with return code: {return_code}")
​
3. 使用Shell模式执行命令

有时需要通过Shell执行命令,这时可以使用 shell=True参数。

import subprocess

def execute_shell_command(command):
    result = subprocess.run(command, shell=True, capture_output=True, text=True)
    return result.stdout

output = execute_shell_command('ls -l | grep py')
print(output)
​
4. 捕获标准输出和标准错误

同时捕获标准输出和标准错误,并处理错误信息。

import subprocess

def execute_command_with_error_handling(command):
    try:
        result = subprocess.run(command, capture_output=True, text=True, check=True)
        return result.stdout
    except subprocess.CalledProcessError as e:
        return f"Error: {e.stderr}"

output = execute_command_with_error_handling(['ls', '-l', '/nonexistent'])
print(output)
​
5. 设置命令超时

可以设置命令的执行超时,避免长时间挂起。

import subprocess

def execute_command_with_timeout(command, timeout):
    try:
        result = subprocess.run(command, capture_output=True, text=True, timeout=timeout)
        return result.stdout
    except subprocess.TimeoutExpired as e:
        return "Error: Command timed out"

output = execute_command_with_timeout(['sleep', '5'], timeout=2)
print(output)
​

三、实战示例

示例1:获取系统信息

import subprocess

def get_system_info():
    uname = subprocess.run(['uname', '-a'], capture_output=True, text=True)
    return uname.stdout

print(get_system_info())
​

示例2:检查网络连通性

import subprocess

def ping_host(host):
    command = ['ping', '-c', '4', host]
    result = subprocess.run(command, capture_output=True, text=True)
    if result.returncode == 0:
        return f"Host {host} is reachable."
    else:
        return f"Host {host} is not reachable."

print(ping_host('google.com'))
​

示例3:备份数据库

import subprocess

def backup_database(db_name, backup_path):
    command = f"pg_dump {db_name} > {backup_path}"
    result = subprocess.run(command, shell=True, capture_output=True, text=True)
    if result.returncode == 0:
        return "Database backup successful."
    else:
        return f"Database backup failed: {result.stderr}"

print(backup_database('mydatabase', '/path/to/backup.sql'))
​

四、总结

通过Python的 subprocess模块,可以灵活地执行Shell命令并获取结果,从而实现系统信息获取、网络连通性检查、数据库备份等自动化任务。结合实际需求和场景,选择合适的 subprocess方法,能显著提高开发和运维效率。

思维导图

+------------------------------------------------------+
|          Python执行Shell命令并获取结果                |
+------------------------------------------------------+
           |
           +-----------------------------+
           | 一、subprocess模块简介        |
           | 1. subprocess.run()          |
           | 2. subprocess.Popen()        |
           | 3. subprocess.check_output() |
           +-----------------------------+
           |
           +-----------------------------+
           | 二、深入解析与实战            |
           | 1. 基本命令执行              |
           | 2. 处理长时间运行的命令      |
           | 3. 使用Shell模式执行命令     |
           | 4. 捕获标准输出和标准错误    |
           | 5. 设置命令超时              |
           +-----------------------------+
           |
           +-----------------------------+
           | 三、实战示例                 |
           | 1. 获取系统信息              |
           | 2. 检查网络连通性            |
           | 3. 备份数据库                |
           +-----------------------------+
           |
           +-----------------------------+
           | 四、总结                    |
           +-----------------------------+
​

通过以上内容,开发者可以在实际项目中灵活应用Python执行Shell命令,实现各种自动化任务,提高开发和运维效率。

目录
相关文章
|
人工智能 API 开发者
HarmonyOS Next~鸿蒙应用框架开发实战:Ability Kit与Accessibility Kit深度解析
本书深入解析HarmonyOS应用框架开发,聚焦Ability Kit与Accessibility Kit两大核心组件。Ability Kit通过FA/PA双引擎架构实现跨设备协同,支持分布式能力开发;Accessibility Kit提供无障碍服务构建方案,优化用户体验。内容涵盖设计理念、实践案例、调试优化及未来演进方向,助力开发者打造高效、包容的分布式应用,体现HarmonyOS生态价值。
837 27
|
数据采集 JSON 数据可视化
JSON数据解析实战:从嵌套结构到结构化表格
在信息爆炸的时代,从杂乱数据中提取精准知识图谱是数据侦探的挑战。本文以Google Scholar为例,解析嵌套JSON数据,提取文献信息并转换为结构化表格,通过Graphviz制作技术关系图谱,揭示文献间的隐秘联系。代码涵盖代理IP、请求头设置、JSON解析及可视化,提供完整实战案例。
806 4
JSON数据解析实战:从嵌套结构到结构化表格
|
网络协议 Shell 网络安全
面试官想听的不仅是命令——如何结构化回答“容器无Shell时如何测试外网”?
“说说看,如果一个Pod的容器没有Shell,如何测试它能否访问外网?”
面试官想听的不仅是命令——如何结构化回答“容器无Shell时如何测试外网”?
|
存储 Unix Shell
Shell 输出命令完全指南:echo 与 printf 的深度剖析
本文深入解析了 Shell 编程中 `echo` 和 `printf` 两个核心输出命令的用法与区别。`echo` 简单易用,适合基础输出;`printf` 功能强大,支持复杂格式化。文章从语法、转义序列、高级技巧到实际应用场景(如日志记录、进度显示)逐一讲解,并对比两者的性能与适用场景,帮助开发者根据需求灵活选择。最后通过进阶技巧和常见问题解答,进一步提升对两者的掌握程度。
753 1
|
数据采集 机器学习/深度学习 存储
可穿戴设备如何重塑医疗健康:技术解析与应用实战
可穿戴设备如何重塑医疗健康:技术解析与应用实战
701 4
|
机器学习/深度学习 人工智能 Java
Java机器学习实战:基于DJL框架的手写数字识别全解析
在人工智能蓬勃发展的今天,Python凭借丰富的生态库(如TensorFlow、PyTorch)成为AI开发的首选语言。但Java作为企业级应用的基石,其在生产环境部署、性能优化和工程化方面的优势不容忽视。DJL(Deep Java Library)的出现完美填补了Java在深度学习领域的空白,它提供了一套统一的API,允许开发者无缝对接主流深度学习框架,将AI模型高效部署到Java生态中。本文将通过手写数字识别的完整流程,深入解析DJL框架的核心机制与应用实践。
871 3
|
缓存 Shell 开发工具
[oeasy]python064_命令行工作流的总结_vim_shell_python
本文总结了命令行工作流中的关键工具和操作,包括vim、shell和Python。主要内容如下: 1. **上次回顾**:完成了输入输出的代码编写,并再次练习了vim的使用。 2. **shell基础**:介绍了shell环境及其基本命令,如`pwd`、`cd`、`ll -l`等。 3. **Python游乐场**:通过`python3`命令进入Python交互环境,可以进行简单计算和函数调用,常用函数有`help`、`ord`、`chr`等。 4. **vim编辑器**:详细讲解了vim的三种模式(正常模式、插入模式、底行命令模式)及其切换方法,以及常用的底行命令如`:w`、`:q`、`
291 15
|
网络协议 Unix Linux
深入解析:Linux网络配置工具ifconfig与ip命令的全面对比
虽然 `ifconfig`作为一个经典的网络配置工具,简单易用,但其功能已经不能满足现代网络配置的需求。相比之下,`ip`命令不仅功能全面,而且提供了一致且简洁的语法,适用于各种网络配置场景。因此,在实际使用中,推荐逐步过渡到 `ip`命令,以更好地适应现代网络管理需求。
802 11
|
缓存 监控 搜索推荐
【实战解析】smallredbook.item_get_video API:小红书视频数据获取与电商应用指南
本文介绍小红书官方API——`smallredbook.item_get_video`的功能与使用方法。该接口可获取笔记视频详情,包括无水印直链、封面图、时长、文本描述、标签及互动数据等,并支持电商场景分析。调用需提供`key`、`secret`和`num_iid`参数,返回字段涵盖视频链接、标题、标签及用户信息等。同时,文章提供了电商实战技巧,如竞品监控与个性化推荐,并列出合规注意事项及替代方案对比。最后解答了常见问题,如笔记ID获取与视频链接时效性等。
|
数据可视化 测试技术 API
GraphQL开发工具选型指南:Apipost高效调试与文档生成实战解析
本文深入解析了GraphQL开发工具Apipost在高效调试与文档生成方面的优势,对比同类工具Apifox,突出其可视化界面、实时调试及自动化文档生成等特性。Apipost通过智能代码补全、错误提示等功能简化复杂Query编写,支持一键生成标准化文档,显著提升开发效率和团队协作效果,尤其适合中大型团队应对复杂业务场景。

推荐镜像

更多