举例讲解Linux系统下Python调用系统Shell的方法
时候难免需要直接调用Shell命令来完成一些比较简单的操作,比如mount一个文件系统之类的。那么我们使用Python如何调用Linux的Shell命令?下面来介绍几种常用的方法: 1.1. os模块的exec方法族
>>> 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方法 >>> os.popen('ls -lt') # 调用os.popen(cmd)并不能得到我们想要的结果 <open file 'ls -lt ',mode 'r' at 0xb7585ee8> >>> 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返回的是一个类文件对象,而本方法将外部程序的输出结果当作字符串返回,很多情况下用起来要更方便些。 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 5900n-rwxr-xr-x 1 long long 23 Jan 5 21:34 hello.shn-rw-r--r-- 1 long long 147 Jan 5 21:34 Makefilen-rw-r--r-- 1 long long 6030829 Jan 5 21:34 log') >>> commands.getoutput('ls -lt') # 返回命令的输出结果(貌似和Shell命令的输出格式不同哈~) 'total 5900n-rwxr-xr-x 1 long long 23 Jan 5 21:34 hello.shn-rw-r--r-- 1 long long 147 Jan 5 21:34 Makefilen-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启动子进程来干活。 subprocess与system相比的优势是它更灵活(你可以得到标准输出,标准错误,“真正”的状态代码,更好的错误处理,等..)。我认为使用os.system已过时,或即将过时。 4. 众方法的比较以及总结 4.2. 关于os.popen 4.4. 关于subprocess.call return_code = subprocess.call("echo Hello World",shell=True)
python和shell读取文件某一行 python和shell(awk命令) 可以实现直接读取文件的某一行,按行号进行读取 。并可以精准的取得该行的某个字段,这个有点类似于x轴、y轴定位某个点的操作。 一、awk取某行某列值 awk 可以设置条件来输出文件中m行到n行中每行的指定的k字段,使用格式如下: awk 'NR==m,NR==n {print $k}' path/filename m,n,k表示实在的数值。如果要用变量来表示m,n的值,则变量需要用单引号将其引起来。NR,{print }是awk命令在此用法下的规定字段;path/filename表示读取文件的路径及文件名。这里指定了两行,如果只指定一行,可以这样写: awk 'NR==m {print $k}' path/filename 二、python取某行某列 标准库提供的linecache模块提供具体取某一行的方法: import linecache theline = linecache.getline(filepath,line_number) 取到相关的行以后,再对theline做split切分成list,再对list索引取值就行了。如theline.split()[2] 。 三、linecache模块的用法 即然,提到了linecache模块,这里就列下linecache的其他方法。linecache模块允许从任何文件里得到任何的行,并且使用缓存进行优化,常见的情况是从单个文件读取多行。 linecache.getlines(filename) 从名为filename的文件中得到全部内容,输出为列表格式,以文件每行为列表中的一个元素,并以linenum-1为元素在列表中的位置存储 # cat a.txt 1a 2b 3c 4d 5e 6f 7g 1、获取a.txt文件的内容 >>> a=linecache.getlines('a.txt') >>> a ['1an','2bn','3cn','4dn','5en','6fn','7gn'] 2、获取a.txt文件中第1-4行的内容 >>> a=linecache.getlines('a.txt')[0:4] >>> a ['1an','4dn'] 3、获取a.txt文件中第4行的内容 >>> a=linecache.getline('a.txt',4) >>> a '4dn' 注意: 使用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()清理缓存,释放缓存。 您可能感兴趣的文章:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |