一文看懂python如何执行cmd命令

news2024/11/18 7:25:35

6afdd66663e44ecfb1abba37025ddc79.jpg

 

概要

 

 在进行Python编程时,经常需要使用到操作系统的命令行,这就要求我们学会如何使用Python执行cmd命令。


 

Python执行cmd命令的几种方法

 

Python是一种强大而灵活的编程语言,它可以很方便地执行系统命令,与操作系统进行交互。本文将介绍Python执行cmd命令的几种常用方法,以及它们的优缺点和使用场景。

 

1. 使用os模块的os.system()函数

 

os模块是Python标准库中的一个模块,它提供了一些与操作系统相关的函数和变量。其中,os.system()函数可以将字符串转化成命令在服务器上运行,返回值是命令的退出状态码,0表示成功,1表示失败,256表示没有返回结果。例如:

import os
a = os.system("ping 192.168.1.101") # 使用a接收返回值
print(a)

这种方法的优点是简单易用,不需要额外的模块导入。缺点是无法获取命令的输出内容,只能获取返回值;而且每次执行命令都会创建一个新的子进程,在资源消耗上比较大。

 

2. 使用os模块的os.popen()函数

 

os.popen()函数也是os模块中的一个函数,它可以通过管道的方式来执行系统命令,返回值是一个文件对象,可以读或者写。如果需要读取输出内容,可以调用read()或readlines()方法。例如:

import os
a = os.popen("ipconfig") # 使用a接收返回值
print(a.read()) # 读取输出内容

这种方法的优点是可以获取命令的输出内容,并对其进行处理;缺点是无法获取命令的返回值,而且也会创建新的子进程。

 

3. 使用subprocess模块

 

subprocess模块是Python从2.4版本开始引入的模块,主要用来取代一些旧的模块方法,如os.system、os.spawn、os.popen、commands.*等。官方推荐使用该模块执行系统命令,subprocess模块通过子进程来执行外部指令,并通过input/output/error管道,获取子进程的执行结果。常用的函数有subprocess.Popen()、subprocess.call()、subprocess.run()等。

 

3.1 使用subprocess.Popen()

 

使用Popen可以创建进程,并与进程进行复杂的交互。它接受一个命令或者一个命令列表作为参数,并返回一个Popen对象。通过调用Popen对象的communicate()方法可以获取输出和错误信息。例如:

import subprocess
# 使用Popen创建进程,并与进程进行复杂的交互
proc = subprocess.Popen(
    'ipconfig', # cmd特定的查询空间的命令
    stdin=None, # 标准输入 键盘
    stdout=subprocess.PIPE, # -1 标准输出(演示器、终端) 保存到管道中以便进行操作
    stderr=subprocess.PIPE, # 标准错误,保存到管道
    shell=True)
outinfo, errinfo = proc.communicate() # 获取输出和错误信息
print(outinfo.decode('gbk')) # 外部程序 (windows系统)决定编码格式
print(errinfo.decode('gbk'))

这种方法的优点是可以灵活地控制输入和输出,并与子进程进行交互;缺点是参数比较复杂,而且需要注意编码格式。

 

3.2 使用subprocess.call()

 

使用call执行指定的命令,返回命令执行状态,功能类似os.system()函数,参数shell默认为False。例如:

import subprocess
# 使用call执行指定的命令,返回命令执行状态
subprocess.call(['df', '-h']) # 数组作为参数运行命令

这种方法的优点是可以获取命令的返回值,并且不需要指定shell参数;缺点是无法获取命令的输出内容。

 

3.3 使用subprocess.run()

 

subprocess.run()是Python3.5中新增的函数,执行指定的命令,返回一个包含执行结果的CompletedProcess类的实例。通过访问CompletedProcess类的属性和方法可以获取更多信息。例如:

import subprocess
# 使用run执行指定的命令,返回一个包含执行结果的CompletedProcess类的实例
result = subprocess.run(['ls', '-l'])
print(result.returncode) # 返回码
print(result.stdout) # 标准输出
print(result.stderr) # 标准错误

这种方法的优点是可以获取更多信息,并且简化了Popen类的使用;缺点是只适用于Python3.5及以上版本。

 

4. 使用cmd模块

 

cmd模块提供了一个简单框架用于编写面向行的命令解释器。可以通过继承Cmd类并实现do_*()方法来自定义解释器类,并且封装动作方法。例如:

import cmd

class MyShell(cmd.Cmd):
    intro = 'Welcome to my shell. Type help or ? to list commands.\n'
    prompt = '(myshell) '
    file = None

    def do_greet(self, arg):
        'Greet the person'
        print(f'Hello {arg}!')

    def do_exit(self, arg):
        'Exit the shell'
        print('Bye')
        return True

if __name__ == '__main__':
    MyShell().cmdloop()

这种方法的优点是可以自定义自己的解释器,并提供帮助信息和自动补全功能;缺点是需要编写更多代码,并且不适合复杂或者交互式的命令。

总体来说:

  • 如果只需要简单地执行一条无需输出内容或者交互式输入参数等功能时,则可使用os.system()函数。

  • 如果需要获取输出内容,则可使用os.popen()函数或者subprocess.Popen()类。

  • 如果需要获取返回值,则可使用os.system()函数或者subprocess.call()函数。

  • 如果需要与子进程进行复杂交互,则可使用subprocess.Popen()类。

  • 如果需要自定义自己的解释器,则可使用cmd模块。

以上就是这次介绍的几种常用操作cmd命令的方法,你学会了嘛?

 

如果对你有帮助,欢迎转发点赞收藏,感谢🙏

 

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

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

相关文章

软件测试人员灵魂三问

可有过高光时刻?职业立足点是什么?前路在何方? 没有光高时刻的职业,不值得留恋 根据马斯洛需求层次理论,当人们温足饭饱后,还需要尊重和自我实现。 同样,作为测试员,工作不仅仅是…

I2C通信协议,最简单的总线通信

串口通信只能在两个设备之间进行,如果是四组串口通信,那每个设备都需要三组串口,其线路连接相当繁琐(如下图)。 为了解决这个痛点,人们设计了一种总线通信,总线通信有很多种协议(如…

记一次gstreamer解码存图绿线问题排查

背景 业务需求需要将某些解码后的视频帧保存为图片,大部分情况下图片都是正常的,更换了某些视频流后,在保存的图片顶部就会出现一条绿线,现记录下解决过程。 部分代码如下 解码回调如下,完整代码可参考之前的文章G…

JVM零基础到高级实战之内存区域分布与概述

JVM零基础到高级实战之内存区域分布与概述 JVM零基础到高级实战之内存区域分布与概述 文章目录 JVM零基础到高级实战之内存区域分布与概述前言Java语言为甚么优势巨大?总结 前言 JVM零基础到高级实战之内存区域分布与概述 Java语言为甚么优势巨大? 一处…

FMCW 雷达室内多目标人员MATLAB仿真

分享一则代码,主要用于FMCW雷达室内多目标MATLAB仿真,涉及到的内容和算法模块有如下: 1、目标参数设置 2、雷达参数设置 3、目标运动状态设置 4、雷达信号建模(IQ信号) 5、雷达近场收发几何位置偏差校正 6、距离维FFT…

速刷剑指offer

链接:No5、 用两个栈来实现一个队列 | 阿秀的学习笔记 第五题跳过。栈和队列等着代码随想录二刷补上。 JZ11 旋转数组的最小数字 链接:旋转数组的最小数字_牛客题霸_牛客网 代码: 这个二分法是左闭右开的,就真的不好理解。 class …

Vue - 第五天 动态组件 插槽 自定义指令

动态组件& 插槽& 自定义指令 一、动态组件1.什么是动态组件2.如何实现动态组件渲染3.使用 keep-alive 保持状态4. keep-alive 对应的生命周期函数5. keep-alive 的 include 属性6.动态展示左右组件7.例子 二、插槽1.什么是插槽2.体验插槽的基础用法2.1 没有预留插槽的内…

VGGNet

论文信息 论文名称:Very Deep Convolutional Networks For Large-Scale Image Recognition 论文地址:https://arxiv.org/pdf/1409.1556.pdf 发表期刊: ICLR 发表年份: 2015 论文详情:VGGNet是2014年ILSVRC&#xff08…

【并发篇】04-05 线程池核心参数代码演示

B站 黑马程序员 java八股的视频笔记 自留备忘 如有错误请多多指教。 (一)理论知识 这道题其实就是在问java中线程池的实现类ThreadPoolExecutor,这个类参数最多的构造方法有7个参数。 线程池本质上就是管理一组线程,用来执行提交…

python:消除已安装库在import导入时出现红线问题

问题 在pycharm中,对于已经安装的库文件,在进行import导入时出现红线,不影响运行, 简单有效的消除红线的方法。 解决办法 在工程目录中的程序可以采用Mark directory - Source Root方法。 对于安装的第三方库文件环境不在本工程…

springboot实现后端防重复提交(AOP+redis分布式锁)单机情况下

文章目录 0、依赖1、自定义接口2、实现redis分布式锁3、自定义AOP4、测试 为什么要实现这个功能呢,可能用户在提交一份数据后,可能因为网络的原因、处理数据的速度慢等原因导致页面没有及时将用户刚提交数据的后台处理结果展示给用户,这时用户…

LayoutTransformer: Layout Generation and Completion with Self-attention

LayoutTransformer: Layout Generation and Completion with Self-attention (Paper reading) Kamal Gupta, University of Maryland, US, Cited:41, Code, Paper 1. 前言 我们解决了在各种领域中(如图像、移动应用、文档和3D对象)进行场景布局生成的…

后台管理系统模板 - zhadminvue

没事的时候写了一个后台管理系统模板:zhadminvue,欢迎大家提issue和PR,以及想要添加一些有意思的功能模块,在没事的时候我也会加进去~ github:https://github.com/iotzzh/zh-admin-vue gitee: https://gitee.com/iotzzh/zh-admin.…

算法模板(4):动态规划(1)

动态规划 闫氏 d p dp dp 分析法: 集合:怎么划分。通常以集合的划分来定义数组。 f ( i , j ) f(i, j) f(i,j):选前 i i i 个物品. 体积不超过 j j j。全部初始化为 0 0 0; j j j 非负时状态才合法。体积恰好是 j j j。 f…

Springboot集成magic-api

目录 1、前言 2、springboot集成magic-api 2.1、添加maven依赖 2.2、application.yml配置 2.3、编写测试接口 2.4、启动程序,访问接口 2.5、magic-api脚本 3、magic-api其他语法 4、注意事项 1、前言 今天项目中遇到一个问题,springboot后端项目…

《机器学习算法竞赛实战》-chapter3数据探索

《机器学习算法竞赛实战》学习笔记,记录一下自己的学习过程,详细的内容请大家购买作者的书籍查阅。 数据探索 数据探索是竞赛的核心模块之一,贯穿竞赛始终,也是很多竞赛胜利的关键。 在竞赛中如何确保自己准备好竞赛使用的算法模…

cmake 添加一个库

目录 项目格式 cmake基本语法 添加库 链接库 添加库的头文件 cmake打印字符串 库的cmake文件 cmake生辰库 mian函数中使用 让库成为可选的 cmake基本语法 设置option变量 cmake设置条件链接库 链接库 添加头文件 修改cmake配置文件 修改引用的源码 项目格式 …

MM32F3273G8P火龙果开发板MindSDK开发教程12 -获取msa311加速器的敲击事件

MM32F3273G8P火龙果开发板MindSDK开发教程12 -获取msa311加速器的敲击事件 1、功能描述 msa311可以识别单击、双击事件,类似手机上的点击返回,双击截屏功能。 单击,双击都能产生中断事件。 中断事件产生后,从对应的状态寄存器读…

算法模板(4):动态规划(3) 做题积累(1)

动态规划 1. 背包 1. 1024. 装箱问题 题意:有一个箱子容量为 V,同时有 n 个物品,每个物品有一个体积(正整数)。要求 n 个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。别学那么死板。…

2023夏-PAT甲级题解

目录 总结: A-1 Trap Input Specification: Output Specification: Sample Input: Sample Output: 题意: 思路: AC代码: A-2 Queue Using Two Stacks Input Specification: Output Specification: Sample Input: Sa…