python调用linux命令输出结果,Python-运行shell命令并捕获输出

小编典典

这个问题的答案取决于你使用的Python版本。最简单的方法是使用以下subprocess.check_output功能:

>>> subprocess.check_output(['ls', '-l'])

b'total 0\n-rw-r--r-- 1 memyself staff 0 Mar 14 11:04 files\n'

该check_output功能适用于仍在广泛使用的几乎所有版本的Python(2.7+)。2但对于较新的版本,不再推荐使用此方法。

现代版本的Python(3.5或更高版本): run

如果你使用的是Python 3.5或更高版本,并且不需要向后兼容,则建议使用新run功能。它为该subprocess模块提供了非常通用的高级API 。要捕获程序的输出,请将subprocess.PIPE标志传递给stdout关键字参数。然后访问stdout返回CompletedProcess对象的属性:

>>> import subprocess

>>> result = subprocess.run(['ls', '-l'], stdout=subprocess.PIPE)

>>> result.stdout

b'total 0\n-rw-r--r-- 1 memyself staff 0 Mar 14 11:04 files\n'

返回值是一个bytes对象,因此,如果你需要正确的字符串,则需要decode它。假设被调用的进程返回一个UTF-8编码的字符串:

>>> result.stdout.decode('utf-8')

'total 0\n-rw-r--r-- 1 memyself staff 0 Mar 14 11:04 files\n'

所有这些都可以压缩为一种格式:

>>> subprocess.run(['ls', '-l'], stdout=subprocess.PIPE).stdout.decode('utf-8')

'total 0\n-rw-r--r-- 1 memyself staff 0 Mar 14 11:04 files\n'

如果要将输入传递给流程的stdin,bytes请将一个对象传递给input关键字参数:

>>> cmd = ['awk', 'length($0) > 5']

>>> input = 'foo\nfoofoo\n'.encode('utf-8')

>>> result = subprocess.run(cmd, stdout=subprocess.PIPE, input=input)

>>> result.stdout.decode('utf-8')

'foofoo\n'

你可以通过传递stderr=subprocess.PIPE(捕获到result.stderr)或stderr=subprocess.STDOUT(捕获到result.stdout常规输出)来捕获错误。如果不考虑安全性,你还可以shell=True按照下面的说明通过传递来运行更复杂的Shell命令。

与旧的工作方式相比,这仅增加了一点复杂性。但是我认为值得这样做:现在,你仅需使用该run功能就可以完成几乎所有需要做的事情。

旧版本的Python(2.7-3.4): check_output

如果你使用的是旧版本的Python,或者需要适度的向后兼容性,则可以使用check_output上面简要介绍的函数。自python 2.7开始可用。

subprocess.check_output(*popenargs, **kwargs)

它采用与Popen(请参见下文)相同的参数,并返回一个包含程序输出的字符串。该答案的开头有一个更详细的用法示例。在Python 3.5及更高版本中,check_output等效于run使用check=True和stdout=PIPE,仅返回stdout属性。

你可以通过stderr=subprocess.STDOUT确保错误信息包含在返回的输出-但在Python中通过一些版本stderr=subprocess.PIPE,以check_output可引起死锁。如果不考虑安全性,你还可以shell=True按照下面的说明通过传递来运行更复杂的Shell命令。

如果你需要通过管道stderr传递输入或将输入传递给流程,check_output则将无法完成任务。Popen在这种情况下,请参见下面的示例。

复杂的应用程序和Python的旧版(2.6及以下版本): Popen

如果需要深度向后的兼容性,或者需要比check_output提供的功能更复杂的功能,则必须直接使用Popen对象,这些对象封装了用于子流程的低级API。

所述Popen构造器接受单个命令没有参数,或列表包含指令作为其第一项,其次是任意数量的参数,每个作为列表一个单独的项目。shlex.split可以帮助将字符串解析为格式正确的列表。Popen对象还接受用于进程IO管理和低级配置的许多不同参数。

发送输入和捕获输出communicate几乎始终是首选方法。如:

output = subprocess.Popen(["mycmd", "myarg"],

stdout=subprocess.PIPE).communicate()[0]

要么

>>> import subprocess

>>> p = subprocess.Popen(['ls', '-a'], stdout=subprocess.PIPE,

... stderr=subprocess.PIPE)

>>> out, err = p.communicate()

>>> print out

.

..

foo

如果设置stdin=PIPE,communicate还允许你通过以下方式将数据传递到流程stdin:

>>> cmd = ['awk', 'length($0) > 5']

>>> p = subprocess.Popen(cmd, stdout=subprocess.PIPE,

... stderr=subprocess.PIPE,

... stdin=subprocess.PIPE)

>>> out, err = p.communicate('foo\nfoofoo\n')

>>> print out

foofoo

注艾伦·霍尔的回答,这表明在某些系统上,你可能需要设置stdout,stderr以及stdin所有PIPE(或DEVNULL)得到communicate工作的。

在极少数情况下,你可能需要复杂的实时输出捕获。Vartec的答案提出了一条前进的道路,但是communicate如果不谨慎使用,则其他方法都容易出现死锁。

与上述所有功能一样,当不考虑安全性时,可以通过传递运行更复杂的Shell命令shell=True。

笔记

1.运行shell命令:shell=True参数

通常,对run,check_output或Popen构造函数的每次调用都会执行一个程序。这意味着没有花哨的bash风格的管道。如果要运行复杂的Shell命令,则可以传递shell=True,这三个功能都支持。

但是,这样做会引起安全问题。如果你要做的不仅仅是轻脚本编写,那么最好单独调用每个进程,并将每个进程的输出作为输入通过以下方式传递给下一个进程:

run(cmd, [stdout=etc...], input=other_output)

要么

Popen(cmd, [stdout=etc...]).communicate(other_output)

直接连接管道的诱惑力很强;抵抗它。否则,你可能会遇到僵局,或者不得不做类似此类的骇人听闻的事情。

2. Unicode注意事项

check_output在Python 2中返回一个字符串,但bytes在Python 3中返回一个对象。如果还没有,则花一点时间来学习unicode。

2020-02-06

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

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

相关文章

python cls_关于python中的self,ins , cls的解释

关于python中的self,ins,cls的解释参考下面两篇博文self比较好理解,self指的是类实例对象本身(注意:不是类本身) class Person: def _init_(self,name): self.namename def sayhello(self): print My name is:,self.name pPerson(Tom) print p 为什么不是…

脚本语言和工程语言_语言工程中有趣的事情

脚本语言和工程语言如果您阅读此博客,您将知道我坚信语言的力量。 所以,我当然有很大的偏见,但是我感觉语言工程社区正在增长,并且越来越有趣的东西正在涌现。 为此,我认为通过查看社区中正在发生的事情并列出一些我发…

linux useradd 数字,详解linux useradd用户组合权限管理等

1,权限相关概念Rwx任何一个文件都应该由两部分组成,这两部分其实基于文件系统来组织,磁盘分区创建完成后,在高级格式化的时候,就把整个磁盘分区分成两部分,其中一部分是源数据,一部分是来放数据…

windows上的python能否在unix上使用_怎么用python在Windows系统下,生成UNIX格式文件

在Windows下换行时,有两个字符:回车(/r)和换行(/n)。但在Linux下,只有一个换行(/n)可使用unix2dos和dos2unix命令进行格式的转换: 参数: -k 保持输出文件和输入文件的日期时间戳不变 -o file 默认模式 . 将file转换&am…

.dmp数据文件的解读

通过PL/SQL Developer导出表数据,生成后缀名为.dmp的文件,如果你以某个用户例如:HYT2LINEHN访问数据库,那么你可以将这个用户下的所有表导成dmp文件,那么这个dmp文件里就包含了这个用户下的所有表的数据,当…

junit jndi_使用Spring创建用于JUnit测试的JNDI资源

junit jndi直到最近,我还使用静态方法来设置内存数据库(HSQLDB)。 我在JUnit测试的setUp / tearDown中调用了这些方法。 当我使用Spring时,这对我来说总是有点不自然,并且所有内容都应在其应用程序上下文中运行。 创建…

c语言程序经过编译以后生成的文件名的后缀为,c语言源文件经过编译后生成文件的后缀是什么...

c语言源文件经过编译后生成文件的后缀是什么c语言源文件经过编译后生成文件的后缀是“.obj”。C语言源程序经过编译程序编译之后,生成一个后缀为“.obj”的文件,最后由称为“连接程序”的软件,把此“.obj”文件与各种库函数连接在一起&#x…

Java中获取系统日期时间/系统时间

int y,m,d,h,mi,s;Calendar calCalendar.getInstance();ycal.get(Calendar.YEAR);mcal.get(Calendar.MONTH) 1;dcal.get(Calendar.DATE);hcal.get(Calendar.HOUR_OF_DAY);mical.get(Calendar.MINUTE);scal.get(Calendar.SECOND);System.out.println("现在时刻是"y&q…

python如何读取csv文件列表页_每25行读取一个csv文件,并使用python传递到列表

我想读取一个文件,并将该文件的每25行转换为一个列表,也就是说,它应该有4个列表,每个列表中包含25个项目(对于一个文件的100行)。我无法获得这个问题的代码。 输入文件看起来像这样,实际上它有100行: {PutRequest: {Item: {id: {S: E1DBEAE3}, value: {M: {result: {N: u0.0015…

Infinispan版本已映射到最低Java版本

我最近一直在与Infinispan交流 ,我注意到这种“分布式内存键/值数据存储”的特征之一是它相对积极地被采用,甚至要求更高版本的Java。 根据参考的Infinispan文档 ,以下内容将Infinispan发行版映射到最低Java SE版本。 Infinispan版本及其最…

通过PL/SQL developer工具访问远程的Oracle数据库_访问数据库_连接数据库_登录数据库

文章目录工具简介电脑没有安装 Oracle 数据库电脑安装了 Oracle 数据库工具简介 PL/SQL Developer 是 Oracle 数据库开发工具,PL/SQL Developer 功能很强大,可以做为集成调试器,有 SQL 窗口,命令窗口,对象浏览器和性能…

dynamodb容器使用_使用DynamoDB映射器将DynamoDB项目映射到对象

dynamodb容器使用以前,我们使用Java创建了DynamoDB表。 对于各种数据库,例如sql数据库或nosql,有一组工具可帮助访问,持久化和管理对象/类与基础数据库之间的数据。 例如,对于SQL数据库,我们使用JPA&#…

xgboost简单介绍_好文干货|全面理解项目中最主流的集成算法XGBoost 和 LightGBM

点击上方“智能与算法之路”,选择“星标”公众号第一时间获取价值内容本文主要介绍基于 Boosting 框架的主流集成算法,包括 XGBoost 和 LightGBM。送上完整的思维导图:XGBoostXGBoost 是大规模并行 boosting tree 的工具,它是目前…

单片机设计时钟程序c语言,单片机电子时钟程序设计

共用体除非必要,否则我们不推荐使用,枚举的用法比较简单,在本书 19 章的项目实践中有很好的示例,这节课我们先来练习一下结构体的使用。下边这个程序的功能是一个带日期的电子钟,相当于一个简易万年历了,并…

本地 Windows 如何将 Web 工程部署到远程 Windows 主机上

文章目录第一步:先连接远程 Windows 主机:第二步:连接远程 Windows 主机后,把发布包复制到远程主机上并确定有关的目录第三步:删除远程主机的数据库中的旧数据第四步:创建新的用户和表空间第五步&#xff1…

kafka streams_Kafka REST Proxy MapR Streams入门

kafka streamsMapR生态系统软件包2.0(MEP)随附了一些与MapR流有关的新功能: 用于MapR Streams的Kafka REST代理为MapR Streams和Kafka集群提供了RESTful接口,使其易于使用和产生消息以及执行管理操作。 Kafka Connect for MapR …

r语言三维柱状图_R语言三维图的绘制

R语言在可视化方面的地位是毋庸置疑的,但是呢相对于MatalabR语言在三维图形的展示上存在一定的劣势。当然,作为大众的免费软件,指定不服,很多人为此也基于R语言开发了一些相应的三维图的绘制包,像rgl,gg3D&…

从事仪表专业学c语言有用吗,测控专业就业方向有哪些 就业前景比你想象中的好...

测控专业就业方向有哪些?这个专业的就业前景好不好?这些问题都是小伙伴们比较关心的问题,下面随小编一起来了解一下吧。主要就业方向1.智能仪器仪表方向,我觉得这个方向主要是从事仪器仪表,电子产品的软件,硬件研发,…

c语言 将url图片存到本地_python爬虫:爬取男生喜欢的图片

任务目标:1.抓取不同类型的图片2.编写一个GUI界面爬虫程序,打包成exe重新文件3.遇到的难点1.分析如何抓取不同类型的图片首先打开网站,可以看到有如下6个类型的菜单在这里插入图片描述点击不同菜单,发现URL显示如下大胸妹&#xf…

hazelcast集群配置_使用HazelCast进行Hibernate缓存:基本配置

hazelcast集群配置之前,我们对JPA缓存,机制以及hibernate提供的内容进行了介绍 。 接下来是一个使用Hazelcast作为二级缓存的Hibernate项目。 为此,我们将在JPA中使用一个基本的spring boot项目。 Spring Boot使用Hibernate作为默认的JPA提…