详解python运行三种方式_详解python调用cmd命令三种方法

目前我使用到的python中执行cmd的方式有三种

使用os.system("cmd")

该方法在调用完shell脚本后,返回一个16位的二进制数,低位为杀死所调用脚本的信号号码,高位为脚本的退出状态码,即脚本中“exit 1”的代码执行后,os.system函数返回值的高位数则是1,如果低位数是0的情况下,则函数的返回值是0×100,换算为10进制得到256。

如果我们需要获得os.system的正确返回值,那使用位移运算可以还原返回值:

>>> n = os.system(test.sh)

>>> n >> 8

>>> 3

这是最简单的一种方法,特点是执行的时候程序会打出cmd在linux上执行的信息。使用前需要import os。

os.system("ls") 仅仅在一个子终端运行系统命令, 而不能获取命令执行后的返回信息

os.Popen

这种调用方式是通过管道的方式来实现,函数返回一个file-like的对象,里面的内容是脚本输出的内容(可简单理解为echo输出的内容)。使用os.popen调用test.sh的情况:python调用Shell脚本,有两种方法:os.system(cmd)或os.popen(cmd),前者返回值是脚本的退出状态码,后者的返回值是脚本执行过程中的输出内容。实际使用时视需求情况而选择。明显地,像调用”ls”这样的shell命令,应该使用popen的方法来获得内容

popen(command [, mode='r' [, bufsize]]) -> pipe

tmp = os.popen('ls *.py').readlines()

subprocess.Popen

现在大部分人都喜欢使用Popen。Popen方法不会打印出cmd在linux上执行的信息。的确,Popen非常强大,支持多种参数和模式。使用前需要from subprocess import Popen, PIPE。但是Popen函数有一个缺陷,就是它是一个阻塞的方法。如果运行cmd时产生的内容非常多,函数非常容易阻塞住。解决办法是不使用wait()方法,但是也不能获得执行的返回值了。

Popen原型是:

subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=false)

参数bufsize:指定缓冲。我到现在还不清楚这个参数的具体含义,望各个大牛指点。

参数executable用于指定可执行程序。一般情况下我们通过args参数来设置所要运行的程序。如果将参数shell设为 True,executable将指定程序使用的shell。在windows平台下,默认的shell由COMSPEC环境变量来指定。

参数stdin, stdout, stderr分别表示程序的标准输入、输出、错误句柄。他们可以是PIPE,文件描述符或文件对象,也可以设置为None,表示从父进程继承。

参数preexec_fn只在Unix平台下有效,用于指定一个可执行对象(callable object),它将在子进程运行之前被调用。

参数Close_sfs:在windows平台下,如果close_fds被设置为True,则新创建的子进程将不会继承父进程的输入、输出、错误管 道。我们不能将close_fds设置为True同时重定向子进程的标准输入、输出与错误(stdin, stdout, stderr)。

如果参数shell设为true,程序将通过shell来执行。

参数cwd用于设置子进程的当前目录。

参数env是字典类型,用于指定子进程的环境变量。如果env = None,子进程的环境变量将从父进程中继承。

参数Universal_newlines:不同操作系统下,文本的换行符是不一样的。如:windows下用'/r/n'表示换,而Linux下用 ‘/n'。如果将此参数设置为True,Python统一把这些换行符当作'/n'来处理。

参数startupinfo与createionflags只在windows下用效,它们将被传递给底层的CreateProcess()函数,用 于设置子进程的一些属性,如:主窗口的外观,进程的优先级等等。

subprocess.PIPE

在创建Popen对象时,subprocess.PIPE可以初始化stdin, stdout或stderr参数,表示与子进程通信的标准流。

subprocess.STDOUT

创建Popen对象时,用于初始化stderr参数,表示将错误通过标准输出流输出。

Popen的方法:

Popen.poll()

用于检查子进程是否已经结束。设置并返回returncode属性。

Popen.wait()

等待子进程结束。设置并返回returncode属性。

Popen.communicate(input=None)

与子进程进行交互。向stdin发送数据,或从stdout和stderr中读取数据。可选参数input指定发送到子进程的参数。 Communicate()返回一个元组:(stdoutdata, stderrdata)。注意:如果希望通过进程的stdin向其发送数据,在创建Popen对象的时候,参数stdin必须被设置为PIPE。同样,如 果希望从stdout和stderr获取数据,必须将stdout和stderr设置为PIPE。

Popen.send_signal(signal)

向子进程发送信号。

Popen.terminate()

停止(stop)子进程。在windows平台下,该方法将调用Windows API TerminateProcess()来结束子进程。

Popen.kill()

杀死子进程。

Popen.stdin

如果在创建Popen对象是,参数stdin被设置为PIPE,Popen.stdin将返回一个文件对象用于策子进程发送指令。否则返回None。

Popen.stdout

如果在创建Popen对象是,参数stdout被设置为PIPE,Popen.stdout将返回一个文件对象用于策子进程发送指令。否则返回 None。

Popen.stderr

如果在创建Popen对象是,参数stdout被设置为PIPE,Popen.stdout将返回一个文件对象用于策子进程发送指令。否则返回 None。

Popen.pid

获取子进程的进程ID。

Popen.returncode

获取进程的返回值。如果进程还没有结束,返回None。

例子一枚

p = Popen("cp -rf a/* b/", shell=True, stdout=PIPE, stderr=PIPE)

p.wait()

if p.returncode != 0:

print "Error."

return -1

使用commands.getstatusoutput方法

这个方法也不会打印出cmd在linux上执行的信息。这个方法唯一的优点是,它不是一个阻塞的方法。即没有Popen函数阻塞的问题。使用前需要import commands。

比如

status, output = commands.getstatusoutput("ls")

还有只获得output和status的方法:

commands.getoutput("ls")

commands.getstatus("ls")

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

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

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

相关文章

一个基于.Net 5开发的轻量级Quartz配置中心 - QuartzCore.Blazor

项目简介QuartzCore.Blazor 是一个基于 .Net5 开发的轻量级 Quartz 作业配置中心,实践应用 Ant Design Blazor 和 FreeSql 两个技术, 对这两个技术感兴趣的小伙伴可以加我一起学习讨论哦,对有 Quartz 有需求的小伙伴亦可以开箱即用Code First…

如何开启jvm日志_做了10个小实验:搞懂了JVM三大参数类型

本实验的目的是讲解 JVM 的三大参数类型。在JVM调优中用到的最多的 XX 参数,而如何去查看和设置 JVM 的 XX 参数也是调优的基本功,本节以实验的方式讲解 JVM 参数的查看和设置。希望大家能有所启发。标配参数常见标配参数-version,获取JDK版本…

ASP VNext 开源服务容错处理库Polly

背景Polly是一个.NET弹性和瞬态故障处理库,允许开发人员以流畅和线程安全的方式表达诸如重试,断路器,超时,隔离头和回退之类的策略。Polly面向.NET Standard 1.1(覆盖范围:.NET Core 1.0,Mono&a…

python中定制类_python定制类__str__(实例详解)

在接下来的文章中,让我们明白什么是python中的自定义类。学习什么是python的自定义类,python定制类可以扮演何种角色在python编程。当你看到像__xxx__ __slots__变量或函数名,你应该注意他们。这些在Python中有特殊用途。我们已经知道如何使用__slots__,我们也知道__len__()方法…

如何在 C# 中使用 Exceptionless

背景“Exceptionless”一词的定义是:无例外。Exceptionless可为您的JavaScript,Node,.NET Core,ASP.NET,Web API,WebForms,WPF,控制台和MVC应用程序提供实时错误报告。它将收集到的信…

xilinx7中管脚mrcc和srcc_Xilinx 7系列FPGA架构之SelectIO结构(一)

引言:从本文开始我们介绍Xilinx 7系列FPGA的SelectIO资源结构及使用,我们在进行FPGA外设硬件及软件设计时,如ADC、PHY、DDR3等,通常会涉及到该资源。本节我们介绍以下知识点:SelectIO资源概述及结构SelectIO管脚通用设…

IdentityServer4系列 | 混合模式

一、前言在上一篇关于授权码模式中, 已经介绍了关于授权码的基本内容,认识到这是一个拥有更为安全的机制,但这个仍然存在局限,虽然在文中我们说到通过后端的方式去获取token,这种由web服务器和授权服务器直接通信,不需要经过用户的…

3m格式的文件怎么转换成mp3_一招就能让PDF与其他格式文件相互转换,这样的大招你值得拥有...

大家都知道,现在不少的大佬比起用Word、Excel等等这些格式文件,它们更喜欢使用PDF文件。而我们不管是将Word、Excel等文件转换成PDF,还是将PDF转换成其他格式文件,都是一件麻烦事,更别说在手机上操作这一切了。别担心&…

如何使用 C# 中的 Tuple

开局一张图,首先声明的是 Tuple 不是什么新鲜概念,在编程语言 F#,Python 中早就有这个了,Tuple 是一种 有序的,有限不可变的,支持混杂类型的固定个数的 一种数据结构,有些朋友可能就想问了&…

中设置colorbar_【值得收藏】如何画出学术论文中需要的各种精美插图,看这一篇就够了!...

本文整理自知乎问答,仅用于学术分享,著作权归作者所有。如有侵权,请联系后台作删文处理。方法一作者|冯昱尧https://www.zhihu.com/question/21664179/answer/18928725强烈推荐 Python 的绘图模块 matplotlib: python plotting 。…

一文说通C#中的异步迭代器

今天来写写C#中的异步迭代器 - 机制、概念和一些好用的特性迭代器的概念迭代器的概念在C#中出现的比较早,很多人可能已经比较熟悉了。通常迭代器会用在一些特定的场景中。举个例子:有一个foreach循环:foreach (var item in Sources) {Console…

GraphQL:Descriptor Attributes

GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时。GraphQL 对你的 API 中的数据提供了一套易于理解的完整描述,使得客户端能够准确地获得它需要的数据,而且没有任何冗余,也让 API 更容易地随着时间推移而演进&#xff0c…

idea怎么把代码放到git_在IDEA中如何初始化Git,把项目推送到Git上

在IDEA中如何初始化Git,把项目推送到Git上登录Gitee(码云)账号,新建仓库先按如下步骤简单新建一个仓库:创建成功后,会出现下图中所示的原始文件:在IDEA上的Terminal中进行操作注意:可能有些朋友刚打开Termi…

大会线上同步直播, 来不到现场也可以线上看直播,以及参会秘籍

紧急提醒:还有1天!2020.NET开发者大会就要开幕啦!你都做好参会准备没有?特殊时期,为方便小伙伴们顺利参会,小编特意整理了这篇大会参会攻略,大到各种日程安排、小到签到、出行、防疫等&#xff…

大曾幽默打油诗_这才是真正的幽默打油诗,逗人一笑,又引人深思!

阅读本文前,请您先点击上面的蓝色字体“点点星光”,再点击“关注”,这样您就可以继续免费收到文章了。每天都有分享。完全是免费订阅,请放心关注来源:诗词天地大曾 ,曾初良,也乐斋主&#xff0c…

如何使用第三方日志记录提供程序替代.NET Core中的内置程序

背景.NET Core 支持适用于各种内置和第三方日志记录提供程序的日志记录 API。 先来看下如何将日志记录 API 与内置提供程序一起使用。调用 CreateDefaultBuilder,这将添加以下日志记录提供程序:控制台调试EventSourceEventLog:仅限 Windowspu…

mysql新加不了数据库_MySQL数据库之mysql增加新用户无法登陆解决方法

本文主要向大家介绍了MySQL数据库之mysql增加新用户无法登陆解决方法 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助。今天安装openstack folsom版本,安装完mysql,为各个服务增加对应的数据库和用户后&#xff0c…

编程去除背景绿幕抠图,基于.NET+OpenCVSharp

摘要:本文介绍了一种使用OpenCVSharp对摄像头中的绿幕视频进行实时“抠人像、替换背景”的方式,对于项目中的算法进行了分析。本文中给出了简化OpenCVSharp中Mat、MatExpr等托管资源释放的方法。本文还介绍了“高效摄像头播放控件”以及和OpenCVSharp的性…

.NET 云原生架构师训练营(模块二 基础巩固 依赖注入)--学习笔记

2.2.1 核心模块--依赖注入什么是依赖注入.NET Core DI 生命周期服务设计服务范围检查ASP.NET Core 依赖注入:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/dependency-injection?viewaspnetcore-5.0什么是依赖注入Dependency injection 依赖注入Inv…

vue ref 绑定的事件需要移除吗_Vue易遗忘的基础复习(二)

数据请求Vue-resource请求在Vue2.0之后已经被舍弃2. fetch请求因为传统 Ajax (指 XMLHttpRequest)存在一些令人头疼的问题:配置和调用方式非常混乱,而且基于事件的异步模型写起来也没有现代的 Promise,generator/yield…