位置: 编程技术 - 正文
推荐整理分享举例讲解Linux系统下Python调用系统Shell的方法(简单介绍linux系统有哪些主要特点?),希望有所帮助,仅作参考,欢迎阅读内容。
文章相关热门搜索词:linux系统详解,简单介绍linux系统有哪些主要特点?,linux系统的基本概念,简述linux系统的组成,linux系统特点和基本操作方法,linux系统的基本概念,简述linux的系统结构,简单介绍linux系统有哪些主要特点?,内容如对您有帮助,希望把文章链接给更多的朋友!
时候难免需要直接调用Shell命令来完成一些比较简单的操作,比如mount一个文件系统之类的。那么我们使用Python如何调用Linux的Shell命令?下面来介绍几种常用的方法:1. os 模块
1.1. os模块的exec方法族Python的exec系统方法同Unix的exec系统调用是一致的。这些方法适用于在子进程中调用外部程序的情况,因为外部程序会替换当前进程的代码,不会返回。( 这个看了点 help(os) --> search "exec" 的相关介绍,但是没太搞明白咋使用)
1.2. os模块的system方法system方法会创建子进程运行外部程序,方法只返回外部程序的运行结果。这个方法比较适用于外部程序没有输出结果的情况。
注意:上面说了,此方法脂肪会外部程序的结果,也就是os.system的结果,所以如果你想接收命令的返回值,接着向下看~
1.3. os模块的popen方法当需要得到外部程序的输出结果时,本方法非常有用,返回一个类文件对象,调用该对象的read()或readlines()方法可以读取输出内容。比如使用urllib调用Web API时,需要对得到的数据进行处理。os.popen(cmd) 要得到命令的输出内容,只需再调用下read()或readlines()等 如a=os.popen(cmd).read()
2. commands 模块
使用commands模块的getoutput方法,这种方法同popend的区别在于popen返回的是一个类文件对象,而本方法将外部程序的输出结果当作字符串返回,很多情况下用起来要更方便些。主要方法: * commands.getstatusoutput(cmd) 返回(status, output)* commands.getoutput(cmd) 只返回输出结果* commands.getstatus(file) 返回ls -ld file的执行结果字符串,调用了getoutput,不建议使用此方法
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会返回一个类文件对象,使用它来访问标准输入、输出。4.3. 关于subprocess.popensubprocess模块的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.callsubprocess模块的call函数。它基本上就像Popen类并都使用相同的参数,但是它只简单的等待命令完成并给你返回代码。比如:
os模块中还有C中那样的fork/exec/spawn函数,但是我不建议直接使用它们。subprocess可能更加适合你。
python和shell读取文件某一行
python和shell(awk命令) 可以实现直接读取文件的某一行,按行号进行读取 。并可以精准的取得该行的某个字段,这个有点类似于x轴、y轴定位某个点的操作。
一、awk取某行某列值
awk 可以设置条件来输出文件中m行到n行中每行的指定的k字段,使用格式如下:
m,n,k表示实在的数值。如果要用变量来表示m,n的值,则变量需要用单引号将其引起来。NR,{print }是awk命令在此用法下的规定字段;path/filename表示读取文件的路径及文件名。这里指定了两行,如果只指定一行,可以这样写:
二、python取某行某列
标准库提供的linecache模块提供具体取某一行的方法:
取到相关的行以后,再对theline做split切分成list,再对list索引取值就行了。如theline.split()[2] 。
三、linecache模块的用法
即然,提到了linecache模块,这里就列下linecache的其他方法。linecache模块允许从任何文件里得到任何的行,并且使用缓存进行优化,常见的情况是从单个文件读取多行。
linecache.getlines(filename) 从名为filename的文件中得到全部内容,输出为列表格式,以文件每行为列表中的一个元素,并以linenum-1为元素在列表中的位置存储linecache.getline(filename,lineno) 从名为filename的文件中得到第lineno行。这个函数从不会抛出一个异常?产生错误时它将返回”(换行符将包含在找到的行里)。如果文件没有找到,这个函数将会在sys.path搜索。linecache.clearcache() 清除缓存。如果你不再需要先前从getline()中得到的行linecache.checkcache(filename) 检查缓存的有效性。如果在缓存中的文件在硬盘上发生了变化,并且你需要更新版本,使用这个函数。如果省略filename,将检查缓存里的所有条目。linecache.updatecache(filename) 更新文件名为filename的缓存。如果filename文件更新了,使用这个函数可以更新linecache.getlines(filename)返回的列表。示例:
1、获取a.txt文件的内容
2、获取a.txt文件中第1-4行的内容
3、获取a.txt文件中第4行的内容
注意:
使用linecache.getlines('a.txt')打开文件的内容之后,如果a.txt文件发生了改变,如你再次用linecache.getlines获取的内容,不是文件的最新内容,还是之前的内容,此时有两种方法:
1、使用linecache.checkcache(filename)来更新文件在硬盘上的缓存,然后在执行linecache.getlines('a.txt')就可以获取到a.txt的最新内容;
2、直接使用linecache.updatecache('a.txt'),即可获取最新的a.txt的最新内容。
读取文件之后你不需要使用文件的缓存时需要在最后清理一下缓存,使linecache.clearcache()清理缓存,释放缓存。
Python的Flask框架中SQLAlchemy使用时的乱码问题解决 一、问题这两天在学习使用flask+SQLAlchemy定制一个web查询页面的demo,在测试时,发现查询到的结果显示乱码。这里将解决方法记录下。二、解决思路1、fl
用Python的Flask框架结合MySQL写一个内存监控程序 这里以监控内存使用率为例,写的一个简单demo性程序,具体操作根据reboot提供的教程写如下。一、建库建表创建falcon数据库:mysqlcreatedatabasefalconcharact
Python实现模拟时钟代码推荐 Python实现模拟时钟代码推荐#coding=utf8importsys,pygame,math,randomfrompygame.localsimport*fromdatetimeimportdatetime,date,timedefprint_text(font,x,y,text,color=(,,)):imgtext=font.re
上一篇:使用Python导出Excel图表以及导出为图片的方法(python数据导出)
下一篇:Python的Flask框架中SQLAlchemy使用时的乱码问题解决(flask框架菜鸟教程)
友情链接: 武汉网站建设