python shell运行当前程序、可以按下_Python下调用Linux的Shell命令的方法

有时候难免需要直接调用Shell命令来完成一些比较简单的操作,比如mount一个文件系统之类的。那么我们使用Python如何调用Linux的Shell命令?下面来介绍几种常用的方法:

1. os 模块

1.1. os模块的exec方法族

Python的exec系统方法同Unix的exec系统调用是一致的。这些方法适用于在子进程中调用外部程序的情况,因为外部程序会替换当前进程的代码,不会返回。( 这个看了点 help(os) --> search "exec" 的相关介绍,但是没太搞明白咋使用)

1.2. os模块的system方法

system方法会创建子进程运行外部程序,方法只返回外部程序的运行结果。这个方法比较适用于外部程序没有输出结果的情况。

>>> import os

>>> os.system("echo \"Hello World\"") # 直接使用os.system调用一个echo命令

Hello World ——————> 打印命令结果

0 ——————> What's this ? 返回值?

>>> val = os.system("ls -al | grep \"log\" ") # 使用val接收返回值

-rw-r--r-- 1 root root 6030829 Dec 31 15:14 log ——————> 此时只打印了命令结果

>>> print val

0 ——————> 注意,此时命令正常运行时,返回值是0

>>> val = os.system("ls -al | grep \"log1\" ")

>>> print val

256 ——————> 使用os.system调用一个没有返回结果的命令,返回值为256~

>>>

注意:上面说了,此方法脂肪会外部程序的结果,也就是os.system的结果,所以如果你想接收命令的返回值,接着向下看~

1.3. os模块的popen方法

当需要得到外部程序的输出结果时,本方法非常有用。比如使用urllib调用Web API时,需要对得到的数据进行处理。os.popen(cmd) 要得到命令的输出内容,只需再调用下read()或readlines()等 如a=os.popen(cmd).read()

>>> os.popen('ls -lt') # 调用os.popen(cmd)并不能得到我们想要的结果

>>> print os.popen('ls -lt').read() # 调用read()方法可以得到命令的结果

total 6064

-rwxr-xr-x 1 long long 23 Jan 5 21:00 hello.sh

-rw-r--r-- 1 long long 147 Jan 5 20:26 Makefile

drwxr-xr-x 3 long long 4096 Jan 2 19:37 test

-rw-r--r-- 1 root root 6030829 Dec 31 15:14 log

drwxr-xr-x 2 long long 4096 Dec 28 09:36 pip_build_long

drwx------ 2 Debian-gdm Debian-gdm 4096 Dec 23 19:08 pulse-gylJ5EL24GU9

drwx------ 2 long long 4096 Jan 1 1970 orbit-long

>>> val = os.popen('ls -lt').read() # 使用变量可以接收命令返回值

>>> if "log" in val: # 我们可以使用in来判断返回值中有木有一个字符串

... print "Haha,there is the log"

... else:

... print "No,not happy"

...

Haha,there is the log

2. commands 模块

使用commands模块的getoutput方法,这种方法同popend的区别在于popen返回的是一个文件句柄,而本方法将外部程序的输出结果当作字符串返回,很多情况下用起来要更方便些。

主要方法:

commands.getstatusoutput(cmd) 返回(status, output)

commands.getoutput(cmd) 只返回输出结果

commands.getstatus(file) 返回ls -ld file的执行结果字符串,调用了getoutput,不建议使用此方法

long@zhouyl:/tmp/tests$ python

Python 2.7.3 (default, Jan 2 2013, 16:53:07)

[GCC 4.7.2] on linux2

Type "help", "copyright", "credits" or "license" for more information.

>>> import commands

>>> commands.getstatusoutput('ls -lt') # 返回(status, output)

(0, 'total 5900\n-rwxr-xr-x 1 long long 23 Jan 5 21:34 hello.sh\n-rw-r--r-- 1 long long 147 Jan 5 21:34 Makefile\n-rw-r--r-- 1 long long 6030829 Jan 5 21:34 log')

>>> commands.getoutput('ls -lt') # 返回命令的输出结果(貌似和Shell命令的输出格式不同哈~)

'total 5900\n-rwxr-xr-x 1 long long 23 Jan 5 21:34 hello.sh\n-rw-r--r-- 1 long long 147 Jan 5 21:34 Makefile\n-rw-r--r-- 1 long long 6030829 Jan 5 21:34 log'

>>> commands.getstatus('log') # 调用commands.getoutput中的命令对'log'文件进行相同的操作

'-rw-r--r-- 1 long long 6030829 Jan 5 21:34 log'

>>>

3. subprocess模块

根据Python官方文档说明,subprocess模块用于取代上面这些模块。有一个用Python实现的并行ssh工具—mssh,代码很简短,不过很有意思,它在线程中调用subprocess启动子进程来干活。

>>> from subprocess import call

>>> call(["ls", "-l"])

subprocess与system相比的优势是它更灵活(你可以得到标准输出,标准错误,“真正”的状态代码,更好的错误处理,等..)。我认为使用os.system已过时,或即将过时。

4. 众方法的比较以及总结

4.1. 关于 os.system

os.system("some_command with args")将命令以及参数传递给你的系统shell,这很好,因为你可以用这种方法同时运行多个命令并且可以设置管道以及输入输出重定向。比如:

os.system("some_command < input_file | another_command > output_file")

然而,虽然这很方便,但是你需要手动处理shell字符的转义,比如空格等。此外,这也只能让你运行简单的shell命令而且不能运行外部程序。

4.2. 关于os.popen

使用stream = os.popen("some_command with args")也能做与os.system一样的事,与os.system不同的是os.popen会给你一个像文件的对象从而你可以使用它来访问哪个程序的标准输入、输出。而且popen还有三个变种都是在I/O处理上有轻微不同。假如你通过一个字符串传递所有东西,你的命令会传递给shell;如果你通过一个列表传递他们,你不用担心逃避任何事。

4.3. 关于subprocess.popen

subprocess模块的Popen类,意图作为os.popen的替代,但是因为其很全面所以比os.popen要显得稍微复杂,使用起来需要学习哦~~。

比如你可以使用 print Popen("echo Hello World", stdout=PIPE, shell=True).stdout.read() 来替代 print os.popen("echo Hello World").read()。但是相比之下它使用一个统一的类包括4中不同的popen函数还是不错的。

4.4. 关于subprocess.call

subprocess模块的call函数。它基本上就像Popen类并都使用相同的参数,但是它只简单的等待命令完成并给你返回代码。比

如:

return_code = subprocess.call("echo Hello World", shell=True)

os模块中还有C中那样的fork/exec/spawn函数,但是我不建议直接使用它们。subprocess可能更加适合你。

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

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

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

相关文章

html伸缩布局,CSS3 伸缩布局(一)

CSS3引入了一种新的布局模式——Flexbox布局&#xff0c;即伸缩布局盒模型(Flexible Box)&#xff0c;用来提供一个更加有效的方式制定、调整和分布一个容器里项目布局&#xff0c;即使它们的大小是未知或者动态的&#xff0c;这里简称为Flex。Flexbox布局常用于设计比较复杂的…

从0开始:500行代码实现 LSM 数据库

简介&#xff1a; LSM-Tree 是很多 NoSQL 数据库引擎的底层实现&#xff0c;例如 LevelDB&#xff0c;Hbase 等。本文基于《数据密集型应用系统设计》中对 LSM-Tree 数据库的设计思路&#xff0c;结合代码实现完整地阐述了一个迷你数据库&#xff0c;核心代码 500 行左右&#…

从 Docker 的信号机制看容器的优雅停止

作者 | Addo Zhang来源 | 云原生指北有太多的文章介绍如何运行容器&#xff0c;然而如何停止容器的文章相对少很多。根据运行的应用类型&#xff0c;应用的停止过程非常重要。如果应用要写文件&#xff0c;停止前要保证正确刷新数据并关闭文件&#xff1b;如果是 HTTP 服务&…

axios链接带参数_axios常见传参方式

1:get请求一般发送请求是这么写axios.get(/user?id12345&nameuser).then(function (res) {console.log(res);}).catch(function (err) {console.log(err);});但是为了方便全局统一调用封装的axiosaxios.get(/user, { //params参数必写 , 如果没有参数传{}也可以params: {i…

使用 Arthas 排查开源 Excel 组件问题

简介&#xff1a; 有了实际的使用之后&#xff0c;不免会想到&#xff0c;Arthas 是如何做到在程序运行时&#xff0c;动态监测我们的代码的呢&#xff1f;带着这样的问题&#xff0c;我们一起来看下 Java Agent 技术实现原理。 背景介绍 ​ 项目中有使用到 com.github.dream…

如何选择python书籍_关于 Python 的经典入门书籍有哪些?

展开全部 关于Python&#xff0c;是最近最火最的编程语言e68a843231313335323631343130323136353331333365643631&#xff0c;挺多人都在学习的&#xff0c;关于它的入门书籍&#xff0c;我大概推荐以下几本&#xff1a; 首先我介绍的是《Python基础教程(第2版修订版)》&#x…

echarts 折线图 html模板,设置ECharts折线图的提示框

回调函数回调函数格式&#xff1a;(params: Object|Array, ticket: string, callback: (ticket: string, html: string)) > string第一个参数 params 是 formatter 需要的数据集。格式如下&#xff1a;{componentType: series,// 系列类型seriesType: string,// 系列在传入的…

“融合、智能、绿色”施耐德电气线上工博以全生命周期解决方案助推数字化

原定于12月1-5日在上海举办的第23届中国国际工业博览会因为疫情再次延期。不必翘首等待&#xff0c;施耐德电气将以线上云展厅的形式如期与您见面&#xff0c;为工业用户呈现一场以“绿色智能制造&#xff0c;共塑可持续未来”为主题的云端盛宴。凭借在绿色智能制造领域的丰富实…

运维更简单、更智能,让运维人不再 “拼命”

简介&#xff1a; 云原生智能运维解决方案&#xff0c;利用大数据为企业日常运维服务&#xff0c;通过可观测数据&#xff0c;融合智能告警与响应中枢&#xff0c;结合机器学习的方法进一步解决自动化运维所未解决的问题&#xff0c;让运维更简单、更智能。 在90%的科幻片中 万…

python全栈马哥_马哥Python全栈+爬虫+高端自动化,资源教程下载

资源名称 马哥Python全栈爬虫高端自动化&#xff0c;资源教程下载 资源介绍 这套课程最后是有项目实战的&#xff0c;如项目四-多人博客开发、项目五CMDB资产管理、项目七-运维流程系统。 资源目录 01Python开班仪式及职业指导 02linux基础-1 03linux基础-2 04linux基础-3 05li…

java 高并发mqtt服务器_Boomer 实战压测 mqtt,2w 并发轻松实现

// main.go// 代码仅供参考,无法直接运行.package mainimport ("bytes""encoding/csv""fmt"MQTT "github.com/eclipse/paho.mqtt.golang""github.com/myzhan/boomer""io""io/ioutil""log"&qu…

从操作系统层面分析Java IO演进之路

简介&#xff1a; 本文从操作系统实际调用角度&#xff08;以CentOS Linux release 7.5操作系统为示例&#xff09;&#xff0c;力求追根溯源看IO的每一步操作到底发生了什么。 作者 | 道坚 来源 | 阿里技术公众号 前言 本文从操作系统实际调用角度&#xff08;以CentOS Linu…

AI是计算机科学,人工智能计算机科学(79种)...

COMPUTER SCIENCE, ARTIFICIAL INTELLIGENCE(人工智能计算机科学) 79种1. ADVANCED ENGINEERING INFORMATICSQuarterlyISSN: 1474-0346ELSEVIER SCI LTD, THE BOULEVARD, LANGFORD LANE, KIDLINGTON, OXFORD, ENGLAND, OXON, OX5 1GB2. AI COMMUNICATIONSQuarterlyISSN: 0921-7…

教程系列——用模板快速上线一个HR 服务中心

简介&#xff1a; 【开箱即用的模板使用系列教程】将会手把手教给大家如何快速启用钉钉宜搭提供各类模板。今天第一讲&#xff0c;介绍《HR 服务中心》的模板启用。 【开箱即用的模板使用系列教程】将会手把手教给大家如何快速启用钉钉宜搭提供各类模板。今天第1讲&#xff0c;…

数字化“团险”黑科技,保险极客技术升级背后心经

作者 | 宋慧 出品 | CSDN 云计算 疫情之后&#xff0c;一切都在“内卷”&#xff0c;HR 也逃不过。初创公司想要招到优秀人才&#xff0c;除了对市场和未来发展的预期和潜力&#xff0c;提供补充医疗险也是对人才重要的保障。另外&#xff0c;现在补充医疗也是知名大企业高福利…

powershell快捷键_借助Windows Terminal搞一个花里胡哨的PowerShell终端

一提起PowerShell&#xff0c;命令提示符等等&#xff0c;想到的就是丑、难用&#xff0c;非常丑&#xff01;各位可以先感受一下。不过&#xff0c;现在我们可以对它做一个美化&#xff0c;美化后的效果如下&#xff0c;各位也可以感受下(本人不提供背景图)下面做简单记录1、必…

linux刷新本地dns命令_两种方法修改Linux下的DNS后立即生效 - 文中之舞

DNS服务器介绍DNS是计算机域名系统(Domain Name System 或Domain Name Service) 的缩写&#xff0c;它是由域名解析器和域名服务器组成的。域名服务器是指保存有该网络中所有主机的域名和对应IP地址&#xff0c;并具有将域名转换为IP地址功能的服务器。其中域名必须对应一个IP地…

【详谈 Delta Lake 】系列技术专题 之 特性(Features)

简介&#xff1a; 本文翻译自大数据技术公司 Databricks 针对数据湖 Delta Lake 的系列技术文章。众所周知&#xff0c;Databricks 主导着开源大数据社区 Apache Spark、Delta Lake 以及 ML Flow 等众多热门技术&#xff0c;而 Delta Lake 作为数据湖核心存储引擎方案给企业带来…

*计算机应用基础* 说课稿,中职计算机应用基础《EXCEL中函数的使用》说课稿.doc...

中职计算机应用基础《EXCEL中函数的使用》说课稿说课稿《EXCEL中函数的使用》选用教材&#xff1a;《计算机应用基础》高等教育出版社出版各位专家、评委好&#xff01;我说课的题目是《EXCEL中函数的使用》&#xff0c;下面我将从教材、教法、学法以及教学程序设计等方面加以说…

python cmp函数未定义_python用plt画图时,cmp设置方法

在python&#xff0c;有时候是需要画图的&#xff0c;比如把一个矩阵用图像的形式显示&#xff0c;之前用的好好的&#xff0c;每次用plt.imshow()&#xff0c;都是彩色图&#xff0c;不知为啥&#xff0c;突然全是黑白图了&#xff0c;于是需要设置cmap的值&#xff0c;如下&a…